附加代码包含三个对std::vector :: assign()的调用。在第一次调用之前,调用std::vector :: reserve()来分配适当数量的内存,然后填充向量。第二次调用assign()在填充第二个向量之前不调用reserve(),因此我期望在此调用assign()期间至少会进行一次分配。第三次调用assign()用于使用新数据重新填充第一个向量。代码中的第四个块使用new分配一个int数组并填充它。
我期望第一、第三和第四个块的性能相等,而第二个块应该需要额外的时间,因为需要进行分配。但实际上我发现第一和第二个块花费相等的时间,而第三和第四个块运行速度显着更快(约30%)。我觉得reserve()的调用实际上没有分配所需空间,而是将分配推迟到调用assign()。
我在两个平台上进行了测试:使用Visual C ++ 2010编译的Windows Vista和使用gcc 4.3.2编译的SUSE Linux。我尝试了不同水平的优化(包括无优化),并继续看到相同的行为。有什么想法,为什么reserve()没有做我期望的事情?如果我看到的是正确的行为,那么reserve()的意义是什么?
谢谢, Josh
我期望第一、第三和第四个块的性能相等,而第二个块应该需要额外的时间,因为需要进行分配。但实际上我发现第一和第二个块花费相等的时间,而第三和第四个块运行速度显着更快(约30%)。我觉得reserve()的调用实际上没有分配所需空间,而是将分配推迟到调用assign()。
我在两个平台上进行了测试:使用Visual C ++ 2010编译的Windows Vista和使用gcc 4.3.2编译的SUSE Linux。我尝试了不同水平的优化(包括无优化),并继续看到相同的行为。有什么想法,为什么reserve()没有做我期望的事情?如果我看到的是正确的行为,那么reserve()的意义是什么?
谢谢, Josh
#include <vector>
#include <time.h>
#include <stdio.h>
#include <iostream>
int main()
{
int len=1E8, nloops=100;
clock_t start, stop;
double wr=0.0, wor=0.0, wc=0.0, pb=0.0;
printf("Number of values tested = %d\n", len);
printf("Number of loops = %d\n", nloops);
std::vector<int> vec1a, vec1b;
for(int i=0; i<len; i++) vec1a.push_back(i);
for(int i=len; i>0; i--) vec1b.push_back(i);
for(int i=0; i<nloops; i++)
{
std::vector<int> vec2, vec3;
int *vec4;
//First block
vec2.reserve(len);
start = clock();
vec2.assign(vec1a.begin(), vec1a.end());
stop = clock();
wr += ((double)(stop-start))/((double)(CLOCKS_PER_SEC));
//Second block
start = clock();
vec3.assign(vec1a.begin(), vec1a.end());
stop = clock();
wor += ((double)(stop-start))/((double)(CLOCKS_PER_SEC));
//Third block
vec2.clear();
start = clock();
vec2.assign(vec1b.begin(), vec1b.end());
stop = clock();
wc += ((double)(stop-start))/((double)(CLOCKS_PER_SEC));
//Fourth block
start = clock();
vec4 = new int[len];
for(int j=0; j<len; j++) vec4[j] = vec1a[j];
stop = clock();
pb += ((double)(stop-start))/((double)(CLOCKS_PER_SEC));
delete []vec4;
}
printf("With reserve() = %10.4lE\n", wr);
printf("Without reserve() = %10.4lE\n", wor);
printf("With clear() = %10.4lE\n", wc);
printf("newed int array = %10.4lE\n", pb);
return 0;
}