【发布时间】:2020-02-05 13:37:30
【问题描述】:
以下代码在使用uniform_real_distribution 时导致g++ 和clang++ 的时间非常不同。
#include <iostream>
#include <sstream>
#include <fstream>
#include <chrono>
#include <random>
std::mt19937::result_type seed = 0;
std::mt19937 gen(seed);
// std::uniform_int_distribution<size_t> distr(0, 1);
std::uniform_real_distribution<double> distr(0.0,1.0);
int main()
{
auto t_start = std::chrono::steady_clock::now();
for (auto i = 1; i <= 1000000; ++i)
{
distr(gen);
}
auto t_end = std::chrono::steady_clock::now();
std::cout << "elapsed time: " << std::chrono::duration_cast<std::chrono::nanoseconds>(t_end - t_start).count() << " ns\n" << std::endl;
return 0;
}
使用以下命令编译:
clang++ -std=c++17 -O3 -flto -march=native -mllvm -inline-threshold=10000000 rng.cpp -o rng
g++ -std=c++17 -O3 -march=native rng.cpp -o rng
这会导致以下时间:
clang: 272929774 ns
gcc: 12054635 ns
当使用注释分布时,时间是:
clang: 48155862 ns
gcc: 50226810 ns
我在这里发现了一个很老的问题,它处理了同样的问题,但是在我的情况下,所提出的解决方案都不起作用。
Clang performance drop for specific C++ random number generation
有人知道这里发生了什么吗?
【问题讨论】:
-
-O3很危险,尤其是在使用浮点数时!如果您正在使用编译标志watch this. -
试试
distr(1.0, 2.0); -
-O2指向同一张图片。不幸的是,distr(1.0, 2.0);也无济于事。 -
在执行这些微基准测试时,始终验证您的代码没有被优化掉!
-
是的,如下所述,如果可能的话,如果代码能被优化掉,我真的很高兴,所以这里的问题应该是,为什么 clang 不能做到这一点?
标签: c++ performance gcc distribution clang++