У uniform_real_distribution огромная разница в производительности между Code Blocks и Visual Studio 2019

Пытаюсь пересадить проект с 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 раз медленнее.

Мне интересно, почему эта проблема возникла, и есть ли способ ее исправить? Спасибо.

Может быть, вы забыли переключиться на релиз? Когда я копирую и вставляю это в VS 2019 и запускаю сборку релиза, я получаю 3122 :)

churill 09.12.2020 20:11

@churill О, ты прав, это работа над моей проблемой. Я действительно ценю это. Но в чем разница между отладкой и выпуском? Прежде чем опубликовать этот вопрос, я попытался выполнить файл .exe в направлении отладки, но у него все еще есть та же проблема с производительностью. Я думаю, что мне нужно учиться для этого. Наконец, еще раз спасибо за ваш ответ.

Cedric Vincent 09.12.2020 20:22

Релизные сборки оптимизируются различными способами. Например, компилятор может встраивать короткие функции, исключать временные переменные, переупорядочивать вызовы функций и т. д., пока наблюдаемое поведение не изменится. Очевидно, что трудно найти ошибки в коде, когда компилятор изменил его полностью, для этого и существует отладочная сборка. Он в несколько раз медленнее, но содержит всю информацию для его отладки ;)

churill 09.12.2020 20:46

Хорошо понял. Это так мило с твоей стороны. Желаю вам всего наилучшего в будущем. :)

Cedric Vincent 09.12.2020 20:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, спасибо за комментарий @churill. Его советы очень полезны.

Между Debug и Release есть много различий.

Ключевым фактором, влияющим на эту проблему, является оптимизация Release при компиляции.

Для дополнительной информации:

https://stackoverflow.com/a/938665/6367757

средняя статья

Я рад, что у вас есть решение, и спасибо, что поделились, я был бы признателен, если бы вы отметили их как ответ, и это будет полезно для другого сообщества.

Jeaninez - MSFT 15.12.2020 08:58

Другие вопросы по теме