C++,实例化std :: vector时性能不佳

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.这是免费软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.

jus*_*tin 6

你意识到这一点:

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版本将执行映射和初始化当你读到记忆.