c++11 STL的binomial_distribution极慢
c++11 STL's binomial_distribution extremely slow
i使用stl的'随机数'生成二元分布的随机数。当范围很大时,它变得非常慢。对于范围40,生成100个数字需要12秒。在更大的范围内,时间大大增加(我需要10000范围的范围)。它似乎不取决于概率参数。我正在使用G 4.5.0。
#include <iostream>
#include <random>
using namespace std;
vector<int> v;
default_random_engine gen(123);
binomial_distribution<int> rbin(40,0.7);
int main(){
v.reserve(2000);
for(int i=0; i<100;++i){
v.push_back(rbin(gen));
}
}
输出:
50.~/.../fs/> g++ -std=c++0x q.cpp
51.~/.../fs/> time ./a.out
real 0m12.102s
user 0m12.094s
sys 0m0.002s
52.~/.../fs/>
i可以使用正常近似,但对于概率参数的极端值是不好的。
更新:
使用'-o3'选项时间变为〜2秒。随着G 4.6.3的问题,问题完全消失了 - 几乎没有任何时间依赖于该范围,而100个数字的一代则需要5ms。
对于大型范围,libstdc 将使用有效的拒绝算法(在Devroye,L。不均匀的随机变量生成之后),但仅当C99 TR1 Math是可用(_GLIBCXX_USE_C99_MATH_TR1
)。否则,它将返回到一个简单的等待时间方法,该方法将在该范围内具有线性。
我建议检查_GLIBCXX_USE_C99_MATH_TR1
的价值以及性能是否在G 的最新版本上有所改善。
您应该确保在性能很重要时启用优化。
您还应该查看可用的随机数引擎,并确保您使用的是满足性能/尺寸/质量要求的
如果问题确实是std::binomial_distribution::operator()
没有充分执行,则可能必须使用其他标准库实现或std::binomial_distribution
的替代实现。BOOST应该具有<random>
的替代实现,您应该可以在没有太多麻烦的情况下使用它,LIBC 也具有替代实现,但是它将更难使用,因为您必须替换整个标准库实现。
相关文章:
- 从udp接收帧对于人脸识别来说太慢
- OpenGL大的3D纹理(>2GB)非常慢
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 为什么std::vector比数组慢
- 为什么一个向量上的多线程操作很慢
- 多线程比没有线程C++慢
- 为什么C++正则表达式这么慢?
- 为什么平均打印数组元素比打印单个对象慢C++?
- 为什么在此排序算法实现中,向量明显比数组慢?
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- 加速极慢的 MinGW-w64 编译/链接?
- 极慢的双线性插值(与OpenCV相比)
- c++11 STL的binomial_distribution极慢
- 极慢的随机字符串生成器
- AppLocker 会导致加载时间极慢
- Boost::Asio HTTP服务器速度极慢
- SFML的帧速率极慢/不规则
- BOOST uBLAS矩阵产品速度极慢
- QT - QFile拷贝操作极慢
- Mongoose Web Server HTTP标头速度极慢