Пытаюсь пересадить проект с Code::Blocks на Visual C++ 2019. После этого у меня возникли некоторые проблемы с производительностью.
Наиболее значительное падение производительности связано с тем, что мне нужно сгенерировать большое количество случайных двойных переменных.
После поиска информации в Интернете я все еще не могу дать разумного объяснения этому.
Я кратко извлекаю часть своего кода ниже:
#include <iostream>
#include <random>
#include <time.h>
class PublicFunction {
public:
static double RandomDouble(double, double);
private:
static std::mt19937 generator_;
};
std::mt19937 PublicFunction::generator_(static_cast<int>(time(0)));
double PublicFunction::RandomDouble(double min_value, double max_value) {
std::uniform_real_distribution<double> distribution(min_value, max_value);
return distribution(PublicFunction::generator_);
}
int main() {
double d;
double t_start, t_end;
t_start = clock();
for (unsigned i = 0; i < 100000000; ++i) {
d = PublicFunction::RandomDouble(-100, 100);
}
t_end = clock();
std::cout << (t_end - t_start) << std::endl;
system("PAUSE");
return 0;
}
После запуска кода в code::blocks, который использует C++ 14 и Visual C++ 2019.
code::blocks завершился со временем выполнения 6155 мс, тогда как Visual C++ получил 40305 мс, что почти в 7 раз медленнее.
Мне интересно, почему эта проблема возникла, и есть ли способ ее исправить? Спасибо.
@churill О, ты прав, это работа над моей проблемой. Я действительно ценю это. Но в чем разница между отладкой и выпуском? Прежде чем опубликовать этот вопрос, я попытался выполнить файл .exe в направлении отладки, но у него все еще есть та же проблема с производительностью. Я думаю, что мне нужно учиться для этого. Наконец, еще раз спасибо за ваш ответ.
Релизные сборки оптимизируются различными способами. Например, компилятор может встраивать короткие функции, исключать временные переменные, переупорядочивать вызовы функций и т. д., пока наблюдаемое поведение не изменится. Очевидно, что трудно найти ошибки в коде, когда компилятор изменил его полностью, для этого и существует отладочная сборка. Он в несколько раз медленнее, но содержит всю информацию для его отладки ;)
Хорошо понял. Это так мило с твоей стороны. Желаю вам всего наилучшего в будущем. :)
Во-первых, спасибо за комментарий @churill. Его советы очень полезны.
Между Debug и Release есть много различий.
Ключевым фактором, влияющим на эту проблему, является оптимизация Release при компиляции.
Для дополнительной информации:
https://stackoverflow.com/a/938665/6367757
Я рад, что у вас есть решение, и спасибо, что поделились, я был бы признателен, если бы вы отметили их как ответ, и это будет полезно для другого сообщества.
Может быть, вы забыли переключиться на релиз? Когда я копирую и вставляю это в VS 2019 и запускаю сборку релиза, я получаю 3122 :)