cla*_*m37 0 c++ arrays performance stl vector
我有一个关于std :: vector实例化的问题.我比较了std :: vector的实例化和相同大小的数组的动态分配.我期待std :: vector的实例化会花费更长的时间但我的性能差异很大.
对于数组我有53 us对于std :: vector我有4338 us
我的代码:
#include <chrono>
#include <vector>
#include <iostream>
int main() {
unsigned int NbItem = 1000000 ;
std::chrono::time_point<std::chrono::system_clock> start, middle ,end;
start = std::chrono::system_clock::now() ;
float * aMallocArea = (float *)calloc(sizeof(float)*NbItem,0) ;
middle = std::chrono::system_clock::now() ;
std::vector<float> aNewArea ;
middle = std::chrono::system_clock::now() ;
aNewArea.resize(NbItem) ;
//float * aMallocArea2 = new float[NbItem];
end = std::chrono::system_clock::now() ;
std::chrono::duration<double> elapsed_middle = middle-start;
std::chrono::duration<double> elapsed_end = end-middle;
std::cout << "ElapsedTime CPU = " << elapsed_middle.count()*1000000 << " (us) " << std::endl ;
std::cout << "ElapsedTime CPU = " << elapsed_end.count()*1000000 << " (us) " << std::endl ;
free(aMallocArea) ;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
即使我创建了一个大小为0的向量,我也有这种差异.你知道为什么我在实例化一个std :: vector时有这么糟糕的表现吗?你知道如何改进这个(我试图使用编译选项-O3,但它没有给出优秀的结果).
编译行:g ++ --std = c ++ 11 -o test ./src/test.cpp
compilator版本:g ++ --version g ++(Debian 4.7.2-5)4.7.2版权所有(C)2012 Free Software Foundation,Inc.这是免费软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.
你意识到这一点:
float * aMallocArea = (float *)calloc(sizeof(float)*NbItem, 0);
Run Code Online (Sandbox Code Playgroud)
是指"分配sizeof(float)*NbItem大小为零的项目"?这意味着该调用执行零字节的分配.
即使您纠正了这一点,calloc在许多情况下表单也会快得多.calloc实现能够"保留"存储器域并返回指针.当您访问内存时,操作系统会映射虚拟内存.
另一方面,矢量实际上经过并初始化/构造其元素.没有实现我知道检查看到a)类型是POD,b)内存为零,以及c)分配器返回归零内存.所以这个初始化过程可能会花费相当多的成本calloc.
所以"C"版本几乎没有(如果你修复你的程序),并且"C++"版本通过,初始化每个元素,并触及分配中的所有内存.它会慢得多.
即使在性能很重要的情况下,这也很少是支持C版本的理由.实际上,您应该只分配实际需要的内存.一旦你开始使用内存,时间就会消失(例如在C版本中,稍后访问它时需要时间来映射内存).如果您是创建第二个计时测试,(说)计算的阵列元素的平均,C++版本可能会更快您的实现,因为内存已被映射和初始化,而C版本将执行映射和初始化当你读到记忆.