随机数生成器的性能因平台而异 我正在测试C++中随机数生成器的性能,并遇到一些我不理解的奇怪结果。

随机数生成器的性能因平台而异 我正在测试C++中随机数生成器的性能,并遇到一些我不理解的奇怪结果。,c++,performance,random,c++17,C++,Performance,Random,C++17,我已经测试了std::rand和std::uniform\u real\u分布,后者使用std::minstd\u rand 计时标准代码::兰德 auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 1000000; ++i) std::rand(); auto finish = std::chrono::high_resolution_clock::now(); std::ch

我已经测试了std::rand和std::uniform\u real\u分布,后者使用std::minstd\u rand

计时标准代码::兰德

auto start = std::chrono::high_resolution_clock::now();

for (int i = 0; i < 1000000; ++i)
    std::rand();

auto finish = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = finish - start;
std::cout << "Elapsed time: " << elapsed.count() * 1000 << " ms\n";
auto start=std::chrono::high_resolution_clock::now();
对于(int i=0;i<1000000;++i)
std::rand();
自动完成=标准::时钟::高分辨率时钟::现在();
std::chrono::持续时间=完成-开始;

STD::CUT< P> C++标准库中的所有分布(包括<代码>一致性RealOffic发行< /COD>)使用一个实现定义的算法。(同样适用于 STD::RAND ,这符合C标准的代码> RAND 函数)。因此,在C++标准库的不同实现中,这些分布之间存在性能差异是自然的。另见

<>你可能想测试C++随机引擎中是否存在性能差异(例如:代码> STD::MimSTdRand Rand < /Cord>和),它在C++标准中指定了固定算法。为此,在引擎中直接生成一个随机数,而不是通过任何C++分布,如<代码>一致性ItIn分发< <代码>或<代码>
我最初认为这是编译器优化,当它没有存储/打印时忽略了统一的_real_分布,因为没有使用变量,因此可以省略,但是为什么编译器不对std::rand[?]执行相同的操作呢


我假定编译器可以进行这种优化,因为在实践中,C++标准库被实现为编译器可用的C++代码,以便编译器可以根据需要对该代码执行某些优化。这与
std::rand
不同,后者仅作为编译器无法实现的函数实现,限制了编译器可以进行的优化。

在Mac设备和Dell设备之间使用
uniform\u real\u distribution
的测试使用std::minstd\u rand,我测试了这两个函数和std::rand。和std::minstd_rand有非常不同的速度。编辑:除非我误解了你在使用minstd_rand时所指的内容,因为我仍然使用统一的真实分布,但是我通过STD::MimStdRand Rand,我假设是随机引擎在随机引擎中直接生成一个随机数,而不是通过任何C++分布,如<代码>一致性ItIn分发< <代码>或<代码>通过直接使用std::minstd_rand,我在Dell上获得16ms,在Mac上获得6ms,测试代码与上面相同,只需直接调用随机引擎,在Dell上使用std::mt19937_64 12ms,在Mac上使用5ms。如果实现相同,这里的差异是否仅仅是由于硬件造成的?对于std::minstd_-rand,我仍然需要存储和打印值,以获得我认为正确的时间(我猜这是由于minstd_-rand是如何实现的)。我会将此标记为性能差异的答案,但您可能知道为什么我需要存储和打印std::minstd_-rand返回的值,因为当我没有的时候,我得到了非常小的7.9e-05的计时。一般来说,硬件平台之间的运行时间数字是不可比较的。你使用VC++上的发布版本吗?是的,使用了发布版本。
std::minstd_rand Mt(std::chrono::system_clock::now().time_since_epoch().count());
std::uniform_real_distribution<float> Distribution(0, 1);

auto start = std::chrono::high_resolution_clock::now();

for (int i = 0; i < 1000000; ++i)
    Distribution(Mt);

auto finish = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = finish - start;
std::cout << "Elapsed time: " << elapsed.count() * 1000 << " ms\n";
std::minstd_rand Mt(std::chrono::system_clock::now().time_since_epoch().count());
std::uniform_real_distribution<float> Distribution(0, 1);

float num;

auto start = std::chrono::high_resolution_clock::now();

for (int i = 0; i < 1000000; ++i)
    num = Distribution(Mt);

auto finish = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = finish - start;
std::cout << "Elapsed time: " << elapsed.count() * 1000 << " ms\n";
std::cout << num << '\n';