哪种方法更快,开销更少?
方法1:
void foo() {
std::vector< int > aVector;
for ( int i = 0; i < 1000000; ++i ) {
aVector.clear();
aVector.push_back( i );
}
}
方法2:
void foo() {
for ( int i = 0; i < 1000000; ++i ) {
std::vector< int > aVector;
aVector.push_back( i );
}
}
你可能会说这个例子毫无意义!但这只是我的大代码的片段。总之,我想知道
是否更好“创建一次向量并清除它以供使用”
或
“每次都创建一个新的矢量”
更新
感谢您的建议,我测试了两个,这里是结果
方法1:
$ time ./test1
real 0m0.044s
user 0m0.042s
sys 0m0.002s
方法2:
$ time ./test2
real 0m0.601s
user 0m0.599s
sys 0m0.002s
清除矢量更好。也许这有助于别人:)
答案 0 :(得分:6)
clear()
最有可能更快,因为您将为先前push_back()
分配的内存保留在向量中,从而减少了分配的需要。
此外,每个循环也会取消1个构造函数调用和1个析构函数调用。
这都忽略了编译器优化器可能对此代码执行的操作。
答案 1 :(得分:0)
创建一个空向量的开销非常小。要增加向大尺寸的矢量可能非常昂贵,因为它每次都会增加一倍 - 因此1M入口矢量将具有由当前内容组成的15-20“副本”。
对于琐碎的基本类型,例如int
,创建对象和销毁对象的开销“没有”,但对于任何更复杂的对象,您将不得不考虑构造和破坏该对象通常远远超过“将对象放入向量中”和“将其从向量中移除”。换句话说,每个对象的构造函数和析构函数都很重要。
对于“X或Y更快”的每一个,你真的需要根据你想要理解的环境进行基准测试,除非很明显一个明显比另一个明显更快(例如“线性搜索或二进制搜索” X元素“,其中线性搜索与X成比例,二分搜索是log2(x))。
此外,我对你的例子感到有些困惑 - 在一个向量中存储一个元素非常繁琐,并且在int x = i;
上有相当大的开销 - 我认为你并不是真的意味着它作为基准。换句话说,你的特定比较不是很公平,因为明确构建1M向量比构造一个向量并填充它并清除它1M次更多。但是,如果你做了这样的测试:
void foo() {
for ( int i = 0; i < 1000; ++i ) {
std::vector< int > aVector;
for(j = 0; j < 1000; j++)
{
aVector.push_back( i );
}
}
}
[以及对其他代码的相应更改],我希望结果非常相似。