Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中使用std::vector的性能损失是什么+;?_C++_Performance_C++11_Vector_Scientific Computing - Fatal编程技术网

C++ 在C+;中使用std::vector的性能损失是什么+;?

C++ 在C+;中使用std::vector的性能损失是什么+;?,c++,performance,c++11,vector,scientific-computing,C++,Performance,C++11,Vector,Scientific Computing,通常,我感兴趣的是了解标准模板库是否会导致数值/科学计算代码的性能/速度开销 例如。 正在将数组声明为 double 2dmatrix [10][10] 会给我比以前更多的表现吗 std::vector<std::vector<double> > 2dmatrix(10,std::vector<double>(10,0.0)) std::vector矩阵(10,std::vector(10,0.0)) ? 我也会理解一些C语言在科学计算中的性能是否优于C

通常,我感兴趣的是了解标准模板库是否会导致数值/科学计算代码的性能/速度开销

例如。 正在将数组声明为

double 2dmatrix [10][10]
会给我比以前更多的表现吗

std::vector<std::vector<double> > 2dmatrix(10,std::vector<double>(10,0.0))
std::vector矩阵(10,std::vector(10,0.0))
?

我也会理解一些C语言在科学计算中的性能是否优于C++。我用STL和C++11编写了非常面向对象的代码。我开始考虑是否应该开始研究纯C,如果它运行得更快。


欢迎对此有任何想法。

std::vector的开销是:

  • 堆栈上的3个指针
  • 动态分配(惰性地,即在需要之前不分配任何内容)
堆栈分配的数组在某些情况下可能更快(对于少量数据)。为此,您可以使用
std::array


如果您需要一个二维网格,我将在单个向量中分配数据:
std::vector(width*height)。然后,您可以编写许多辅助函数,以通过x和y坐标获得元素。(或者您可以编写一个。)

如果您没有理由调整数组的大小,并且在编译过程中知道它的大小(正如您在第一个示例中所做的),STL模板的更好选择是
std::array
模板。它为您提供了与C样式阵列相同的所有好处

double 2dmatrix[10][10];

// would become

std::array<std::array<double, 10>, 10> 2dmatrix;
double-2dmatrix[10][10];
//将成为
std::阵列矩阵;

< >代码> < P> <强>提供了,C++ >代码> STD::vector < /C> >:它在堆栈上有3个指针,动态分配的数据在线性增长场景中平均每1个元素重新分配(因为调整大小会使容量超过比例,因子为1.5到2)。p> 使用
malloc()。此外,
std::vector
允许用户定义的性能调整通过(基于池、堆栈分配等),这在C++11中不像在C++98中那样难以使用

如果不需要动态调整大小,可以在C和C++中同时对静态数组(或C++中的代码> STD::数组)进行代码编写。p> 一般来说,对于高性能计算,特别是通过使用可以内联的函数对象(与常规C函数指针相反)。

int comp(常数无效*a,常数无效*b){
返回/*您在此处的比较*/;
}
//C风格排序
qsort(arr、大尺寸、sizeof(int)、comp);

^^^^如果您事先知道大小,并且性能是一个瓶颈,请使用C++11中的
std::array
。它的性能与C风格阵列完全相同,因为它在内部看起来像

template<typename T, int N>
struct array {
  T _data[N];
};
模板
结构数组{
T_数据[N];
};

这是一种在现代C++中使用栈分配数组的方法。如果你有一个现代的编译器,千万不要使用C风格的数组

人们会说“这取决于你在做什么”

他们是对的

有一个例子,使用
std::vector
传统设计的程序通过一系列六个阶段进行性能调整,其执行时间从每单位工作2700微秒减少到3.7秒,加速系数为730x

所做的第一件事是注意到,很大一部分时间都花在不断增长的数组和从中删除元素上。 因此使用了不同的数组类,这大大减少了时间

所做的第二件事是注意到大部分时间仍在进行与数组相关的活动。 因此,数组被完全消除,而使用链表,产生了另一个巨大的加速

然后其他的事情会占用剩余时间的很大一部分,比如
new
ing和
delete
ing对象。 然后,这些对象在免费列表中被回收,产生了另一个巨大的加速。 经过几个阶段后,决定停止尝试,因为越来越难找到需要改进的地方,而且加速被认为是足够的

关键是,不要只是选择一些强烈推荐的东西,然后抱着最好的希望。 而是以这种或那种方式构建它,然后像这样进行性能调优,并愿意在数据结构设计中进行重大更改,这取决于您所看到的大部分时间都花在了哪些方面。 并对其进行迭代。 您可以将存储方案从A更改为B,然后从B更改为C。
这很好。

在科学计算中,错误和次优代码特别令人沮丧,因为大量数据被错误处理,浪费了宝贵的时间

std::vector
可能是您的瓶颈或最佳执行者,这取决于您对其内部工作原理的了解。特别注意
reserve()
insert()
erase()
;如果程序被线程化,考虑学习对齐和处理器缓存。


如果您试图自己进行所有内存管理,特别是当您逐步向软件添加功能时,请考虑一下您必须花费多少时间来确保一致性,以及以后寻找bug。在最后一天,STD的开销::向量将是你的问题中的最小问题。

< P>科学计算,使用专用的C++矩阵库,你会更好。这不仅为您提供了快速的数组处理,还提供了许多经过彻底调试的线性代数运算

除了性能原因,使用专用C++矩阵库也将大大减少代码的冗长,使MI变小。

template<typename T, int N>
struct array {
  T _data[N];
};