我正在编写物理模拟代码,现在觉得需要对其进行优化。我正在考虑改进一点:我类的一个方法(在几种情况下我称之为十亿次)每次都定义概率分布。这是代码:
void myClass::myMethod(){ //called billions of times in several cases
uniform_real_distribution<> probd(0,1);
uniform_int_distribution<> probh(1,h-2);
uniform_int_distribution<> probv(1,v-2);
//rest of the code
}
我能否将分布作为类的成员传递,这样我就不必每次都定义它们了?并在构造函数中初始化它们并在 h 和 v 更改时重新定义它们?能不能算是一个好的优化进度?最后一个问题,当使用标志 -O3 或 -O2 编译时,它是否已经被编译器(在我的例子中是 g++)更正了?
提前致谢!
更新:我对它进行了编码并为两者计时:程序实际上变慢了一点(百分之几)所以我回到了我开始的地方:在每个循环中创建概率分布
最佳答案
答案A:我不应该这么认为,对于均匀分布来说,它只是将参数值复制到位,可能需要少量的运算,并且会得到很好的优化。
但是,我相信分布对象可以有状态。他们可以使用来自对生成器的调用的部分随机数据,并允许保存剩余的随机性以在下次使用分布时使用,以减少对生成器的调用总数。因此,当您销毁分发对象时,您可能会丢弃一些可能代价高昂的随机数据。
答案B:停止猜测并测试它。
为您的代码计时,然后将 static
添加到 probd
的定义中,然后再次计时。
关于c++ - 定义概率分布成本高吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19706129/