【问题标题】:uniform_real_distribution has a huge performance difference between Code Blocks and Visual Studio 2019uniform_real_distribution 在 Code Blocks 和 Visual Studio 2019 之间有巨大的性能差异
【发布时间】:2021-03-21 05:06:57
【问题描述】:

我尝试将项目从 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;

}

在使用 C++ 14 和 Visual C++ 2019 的 code::blocks 中运行代码后。

code::blocks 的执行时间为 6155 毫秒,而 Visual C++ 为 40305 毫秒,几乎慢了 7 倍。

我想知道为什么会出现这个问题,有什么办法可以解决吗?谢谢。

【问题讨论】:

  • 您是否忘记切换到发布?当我将其复制粘贴到 VS 2019 并作为发布版本运行时,我得到 3122 :)
  • @churill 哦,你是对的,这对我的问题有效。我真的很感激。但是调试和发布有什么区别呢?在我发布这个问题之前,我曾尝试在调试方向执行 .exe 文件,但它仍然存在相同的性能问题。我想我需要为此学习。最后,再次感谢您的回答。
  • 发布版本以各种方式进行了优化。例如,只要可观察的行为没有改变,编译器可能会内联短函数、消除临时变量、重新排序函数调用等。显然,当编译器完全改变代码时,很难在代码中找到错误,这就是调试构建的目的。它慢了好几倍,但包含调试它的所有信息;)
  • 好的,知道了。你真好。祝你未来一切顺利。 :)

标签: c++ visual-studio visual-c++ c++14 codeblocks


【解决方案1】:

首先,感谢@churill 的评论。他的建议很有用。

Debug 和 Release 有很多不同。

影响这个问题的关键因素是Release会在编译时进行优化。

更多信息:

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

medium article

【讨论】:

  • 很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 2018-08-29
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
相关资源
最近更新 更多