【发布时间】:2013-06-25 07:14:25
【问题描述】:
对于 c++ 中的一些数值模拟,我需要生成许多具有指数分布的随机数(都具有相同的预定分布)。目前,我的程序运行良好,但超过 50% 的 CPU 时间用于生成这些随机数。
我想做的是以不阻塞模拟主循环的方式生成这些随机数。更准确地说,我希望有一个线程,其工作是始终保持“提前准备好”的随机数,并在有人读取这个随机数时立即生成一个新的。
有人知道这样做的好方法吗?
目前,我的顺序代码如下所示:
#include <stdio.h>
#include <iostream>
#include <random>
using namespace std;
// exponential random variable with parameter lambda
class EXPGenerator{
exponential_distribution<> expo;
mt19937 engine; //mersene twister
public:
EXPGenerator(double lambda){
expo = exponential_distribution<>(lambda);
engine = mt19937(time(NULL));
}
double step(){
return expo(engine);
}
};
int main(int argc, char *argv[])
{
EXPGenerator expgen(2.0);
for(int i=0; i<100000; i++) {
double randv(expgen.step());
std::cout << randv << endl;
// do something complicated
}
return 0;
}
我使用clang++ -O2 --std=c++11 --stdlib=libc++ test.cpp -o test编译它
[编辑:在上面添加 -O2]
【问题讨论】:
-
您为什么要根据未优化构建的性能做出决策?在您寻求任何复杂且难以维护的解决方案之前,请测试您是否真的有真正的问题。启用优化后,代码可能会足够快。
-
上面的程序只是一个例子,我的问题实际上是基于某些东西。我已经尽可能地优化了真实的程序,它仍然需要几个小时才能运行......我们正在谈论模拟随机扩散过程,这需要数千个时间步长和数千次模拟才能获得良好的统计数据......
-
您正在编译但未启用优化
-
确实如此,上面的命令行也是如此。但真正的程序(这里显示太长)是用-O2 编译的。抱歉,我应该将 -O2 放在我原来的问题中。
-
很公平。 :) 是的,在最初的问题中表明这一点可以避免一些混淆但是只要你的测量基于优化的构建,这就是主要的事情;)
标签: c++ multithreading random c++11