atm*_*ere 9 c++ performance vector scientific-computing c++11
通常,我很想知道标准模板库是否会在数值/科学计算的代码中产生性能/速度开销.
例如.将数组声明为
double 2dmatrix [10][10]
Run Code Online (Sandbox Code Playgroud)
会给我更多的表现
std::vector<std::vector<double> > 2dmatrix(10,std::vector<double>(10,0.0))
Run Code Online (Sandbox Code Playgroud)
?
我还要感谢一些一般性的想法,关于C在科学计算方面是否具有比C++更好的性能.我使用STL以非常面向对象的方式编写了我的代码,并且使用了C++ 11.我开始考虑是否应该开始研究纯C,如果它运行得更快.
对此有任何想法都是受欢迎的.
Tem*_*Rex 14
考虑到它提供的抽象,C++ std::vector就像它获得的效率一样:堆栈上有3个指针,动态分配的数据在线性增长情况下平均每个元素重新分配1次(因为调整大小比按比例扩展容量,因子为1.5至2).
C等价物使用malloc()和realloc()将至少同样昂贵,并且更加繁琐(手动调整大小等).此外,它std::vector允许通过特殊分配器(基于池,堆栈分配等)进行用户定义的性能调优,这在C++ 11中并不像在C++ 98中那样难以使用.
如果不需要动态调整大小,可以在C和C++中编写静态数组(或std::array在C++中).
通常,对于高性能计算,C++具有更多的优化潜力,特别是通过使用可以内联的函数对象(与常规C函数指针相比).的典型的例子是排序
int comp( const void* a, const void* b ) {
return /* your comparison here */;
}
// C style sorting
qsort( arr, LARGE_SIZE, sizeof( int ), comp );
^^^^ <---- no-inlining through function pointer
// C++11 style sorting (use hand-made function object for C++98
std::sort(std::begin(arr), std::end(arr), [](auto a, auto b) {
return comp(&a, &b);
^^^^ <----- C++11 lambdas can be fully inlined
});
Run Code Online (Sandbox Code Playgroud)
std :: vector的开销是:
在某些情况下(对于少量数据),堆栈分配的阵列可能更快.为此您可以使用std::array<T, Length>.
如果你需要一个二维网格,我会在一个向量中分配数据:std::vector<T>(width * height);.然后你可以编写一些辅助函数来通过x和y坐标获取元素.(或者你可以写一个包装类.)
| 归档时间: |
|
| 查看次数: |
5397 次 |
| 最近记录: |