定义概率分布代价是否昂贵?

Lia*_*iam 1 c++ optimization probability

我正在编写一个物理模拟编码,现在我觉得需要优化它.我正在考虑改进一点:我的一个方法之一(在几种情况下我称之为十亿次)每次定义一个概率分布.这是代码:

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
}
Run Code Online (Sandbox Code Playgroud)

我可以将分发作为类的成员传递,这样我就不必每次都定义它们吗?只需在构造函数中初始化它们,并在h和v更改时重新定义它们?这可能是一个很好的优化进展吗?最后一个问题,当使用标志-O3或-O2编译时,编译器(在我的情况下是g ++)是否已经纠正了这个问题?

先感谢您!

更新:我对它进行了编码并对两者进行了计时:程序实际上变得有点慢(几个百分点)所以我回到了我的开始:在每个循环中创建概率分布

Ste*_*sop 5

答案A:我不应该这么认为,对于均匀分布,它只是将参数值复制到位,可能只需要少量算术,并且可以很好地优化.

但是,我相信分发对象可以有状态.它们可以使用来自对生成器的调用的部分随机数据,并且允许保留下次使用分布时使用的其余随机性,以便减少对生成器的调用总数.因此,当您销毁分发对象时,您可能会丢弃一些可能代价高昂的随机数据.

答案B:停止猜测并测试它.

为代码计时,然后添加static到定义中probd并再次计时.