gpt4 book ai didi

performance - 随机数,C++11 与 Boost

转载 作者:行者123 更新时间:2023-12-03 00:52:42 25 4
gpt4 key购买 nike

我想在 C++ 中生成伪随机数,两个可能的选项是 C++11 的功能和 Boost 对应的功能。它们的使用方式本质上是相同的,但在我的测试中,原生的速度大约慢 4 倍。

这是由于库中的设计选择造成的,还是我缺少某种在某处禁用调试代码的方法?

更新:代码在这里,https://github.com/vbeffara/Simulations/blob/master/tests/test_prng.cpp看起来像这样:

cerr << "boost::bernoulli_distribution ...      \ttime = ";
s=0; t=time();
boost::bernoulli_distribution<> dist(.5);
boost::mt19937 boostengine;
for (int i=0; i<n; ++i) s += dist(boostengine);
cerr << time()-t << ", \tsum = " << s << endl;

cerr << "C++11 style ... \ttime = ";
s=0; t=time();
std::bernoulli_distribution dist2(.5);
std::mt19937_64 engine;
for (int i=0; i<n; ++i) s += dist2(engine);
cerr << time()-t << ", \tsum = " << s << endl;

(使用 std::mt19937 而不是 std::mt19937_64 会使它在我的系统上变得更慢。)

最佳答案

That’s挺吓人的。

让我们看看:

boost::bernoulli_distribution<>

if(_p == RealType(0))
return false;
else
return RealType(eng()-(eng.min)()) <= _p * RealType((eng.max)()-(eng.min)());

std::bernoulli_distribution

__detail::_Adaptor<_UniformRandomNumberGenerator, double> __aurng(__urng);
if ((__aurng() - __aurng.min()) < __p.p() * (__aurng.max() - __aurng.min()))
return true;
return false;

两个版本都会调用引擎并检查输出是否位于与给定概率成比例的值范围的一部分内。

最大的区别是,gcc 版本调用辅助类 _Adaptor 的函数。

此类的 minmax 函数分别返回 01 以及 operator() 然后使用给定的 URNG 调用 std::generate_canonical 来获取 01 之间的值。

std::generate_canonical 是一个带有循环的 20 行函数 - 在这种情况下永远不会迭代多次,但它增加了复杂性。

除此之外,boost 仅在发行版的构造函数中使用 param_type,但随后将 _p 保存为 double 成员,而gcc 有一个 param_type 成员并且必须“获取”它的值。

这一切都与编译器结合在一起 fails in optimizing 。叮 chokes even more在上面。

如果您hammer hard enough你甚至可以得到 gcc 的 std::mt19937boost::mt19937 en par。

如果能测试一下 libc++ 就好了,也许我稍后会添加它。

<小时/>

测试版本:boost 1.55.0、gcc 4.8.2 的 libstdc++ 头文件
根据要求提供行号^^

关于performance - 随机数,C++11 与 Boost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20998470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com