[英]c++ vector performance non intuitive result?
我对VS2010中的性能向导不满意,该向导用于测试检测(函数调用计数和计时)。
在学习了C ++ STL中的向量之后,我才决定看看我能获得关于用一百万个整数填充向量的性能的哪些信息:
#include <iostream>
#include <vector>
void generate_ints();
int main() {
generate_ints();
return 0;
}
void generate_ints() {
typedef std::vector<int> Generator;
typedef std::vector<int>::iterator iter;
typedef std::vector<int>::size_type size;
Generator generator;
for (size i = 0; i != 1000000; ++i) {
generator.push_back(i);
}
}
我得到的是:上面的经过时间为2402.37毫秒。 但是我了解到,向量在内存不足时必须重新调整自身大小,因为它们在内存中是连续的。 因此,我认为通过对上述内容进行补充可以得到更好的性能:
generate.reserve(1000000);
但是,这会使程序的执行时间增加一倍,达到大约5000毫秒。 这是函数调用的屏幕截图,左侧没有上面的代码行,右侧没有。 我真的不明白这个结果,而且鉴于我了解到如何定义矢量容量(如果您知道会用吨填充)的定义,这对我来说是没有意义的。 指定储备基本上使大多数函数调用加倍。
从您发布的屏幕快照来看,您似乎是在没有优化的情况下进行编译,这会使您执行的所有基准测试无效。
您可以在关注性能时进行基准测试,而在关注性能时,可以按编译器上的“快速运行”按钮,并启用优化。
告诉编译器变慢,然后担心它的速度比预期的慢是没有意义的。 我不确定插入reserve
调用时为什么代码变慢 ,但是在调试版本中,插入了许多运行时检查以捕获更多错误,并且reserve
调用很有可能导致执行更多此类检查,减慢代码速度。
启用优化,看看会发生什么。 :)
您是否在发布配置下执行了所有基准测试?
另外,请尝试在Profiler之外运行,以防遇到一些Profiler引起的伪像(将手动时间测量值添加到代码中-您可以为此使用clock()
)。
另外,您是否有机会打错字并实际上称为resize
而不是reserve
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.