【发布时间】:2014-12-10 10:50:22
【问题描述】:
我有一个关于 std::vector 实例化的问题。我比较了 std::vector 的实例化和相同大小的数组的动态分配。我原以为 std::vector 的实例化需要更长的时间,但我的性能差异很大。
对于数组,我有 53 个我们 对于 std::vector 我有 4338 我们
我的代码:
#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;
}
即使我创建一个大小为 0 的向量,我也有这个区别。 你知道为什么我在实例化 std::vector 时表现如此糟糕吗? 你知道如何改进吗(我尝试使用编译选项 -O3 但它没有给出出色的结果)。
编译行: g++ --std=c++11 -o test ./src/test.cpp
编译器版本: g++ --版本 g++ (Debian 4.7.2-5) 4.7.2 版权所有 (C) 2012 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有 保修单;甚至不是为了适销性或特定用途的适用性。
【问题讨论】:
-
std::vector的第一次实例化可能会产生开销。但是后续的实例化呢? -
请提供您的编译器版本和编译命令行。
-
calloc(sizeof(float)*NbItem,0)这有点奇怪,分配了 0 大小的对象。这不是问题,但我会尝试分配至少 1 的大小,看看它的行为是否有任何不同。 -
将 0 的大小传递给
calloc是实现定义的,并且使整个比较完全没有价值,因为它可能只是返回Null而无需进行任何分配。见:en.cppreference.com/w/cpp/memory/c/calloc
标签: c++ arrays performance vector stl