【发布时间】:2020-12-08 23:38:26
【问题描述】:
fibs 是一个 std::vector。使用 g++,我被建议将 fibs.size() 退出循环,以节省每次计算它(因为向量可能会改变)
int sum = 0;
for(int i = 0; i < fibs.size(); ++i){
if(fibs[i] % 2 == 0){
sum += fibs[i];
}
}
编译器中肯定有一些数据流分析会告诉我们 fibs 不会改变大小。有没有?或者我应该将其他一些变量设置为 fibs.size() 并在循环条件中使用它?
【问题讨论】:
-
1 + 1 + 2 + 3 + 5 + ... + Fn = Fn+2 - 1.
-
因此,无论谁建议您都不希望每次都计算
size(g++ 中的减法,在优化之前),但不介意调用operator[](以及比较的额外加法)在优化之前使用迭代器)两次。什么,确实如此。最好是查看发出的指令,或者计时。 -
Steve,如果我知道向量的大小保证不会改变,那么使用 operator[] 不只是节省时间吗?另外,我是一个 C++ 小丑。那么使用迭代器是否更快?
-
@shuttle87:我是说 如果 有人(无论谁给出了这个建议)将对性能做出疯狂的概括,我有点惊讶他们是猜测
size()比访问变量慢,但他们并没有猜测operator[]比使用迭代器或指针慢。我不会准确猜测优化器会做什么——它实际上可能会设法用指针替换索引i,但要这样做,它必须以某种方式说服自己向量永远不会重新分配,这几乎比说服自己容易它可以提升size的值。 -
基本问题是
operator[]必须将向量的基指针从向量对象中加载出来(并添加索引),就像 gcc 上的size()将基指针和结束指针加载出来一样矢量对象的(并减去它们)。因此,在这两种情况下,它几乎是同一种繁琐的微优化。就我个人而言,在这段代码被证明是瓶颈之前,我不会担心它们,然后检查发出的代码。但是,如果您要担心一个,我认为您应该同时担心两者。
标签: c++