【发布时间】:2010-12-17 02:29:49
【问题描述】:
inline void add(const DataStruct& rhs) {
using namespace boost::assign;
vec.reserve(vec.size() + 3);
vec += rhs.a, rhs.b, rhs.c;
}
上面的函数执行了大约 17000 次,它执行了(据我所见。其中涉及一些转换)与调用 vector::reserve 时差了大约 2 个数量级。
我一直认为即使对于较小的值,reserve 也可以加快 push_back 的速度,但这似乎不是真的,我找不到任何明显的理由为什么不应该这样。保留会阻止函数的内联吗?对 size() 的调用是否太贵了?这取决于平台吗?我将尝试编写一些小型基准测试,以在干净的环境中确认这一点。
编译器:gcc (GCC) 4.4.2 with -g -O2
【问题讨论】:
-
您是否尝试为 17000*3 输入预留空间?您的额外函数调用可能会产生一些开销,这可能会导致差异。
-
@splicer:这个数字是由于测试数据。实际调用次数是可变的。
-
我的意思是,你所做的只有在处理更大的数字时才有效。 James Schek 的回答为您提供了一种通过可变数量的调用来完成此操作的方法,只要您知道开始的总数即可。否则你最好让默认实现为你处理它。
-
你是在同一个类实例上调用 add() 吗?在这种情况下,每次添加都会使 vec 增加 3,而推回本身会使 vec 增长的频率要低得多。
标签: c++ performance stl stdvector