C ++缓存向量空()

时间:2014-07-10 13:05:59

标签: c++

缓存vector.empty()值是否有意义?

Vector<X> list;
...
if(!list.empty()){          // cmp + jnz
   ...
   // some heavy calculations
   ...
   list.pop_back();
}

VS

Vector<X> list;
bool list_empty;
...
if(!list_empty){            // jnz
   ...
   // some heavy calculations
   ...
   list.pop_back();
   list_empty = list.empty();   // cmp
}

其中

bool List::empty(){
  return last_ptr == first_ptr;         // implementation from gcc's std
}

我认为缓存更好,因为在list不为空的情况下,只需要1 op进行比较。加上cmp,它应该从内存中获取两个值,而对于jnz,只有一个。

P.S。矢量只是一个很好的例子。这种逻辑可以出现在另一种情况下。

3 个答案:

答案 0 :(得分:8)

鉴于现代积极的编译器优化,我们不应该浪费时间来担心这些琐事,但是如果你必须:通过分析器运行每个版本并亲自看看哪个更快以及如何得多。

答案 1 :(得分:1)

std::forward_list之外的所有标准容器都有size()的恒定时间,因此empty()std::forward_list只有empty()的固定成本。

因此,对自己进行缓存对性能有负面影响(或至少没有正面影响)。

不要忘记&#34; as-if&#34; -rule及其异常:只要编译的程序对任何已定义的行为具有相同的可观察行为(或者更改是由异常覆盖),编译器可以进行任何想要的转换。

无论如何,如果在测量之后你确定了代码太慢的地方,首先要尝试更好的算法,然后测量每个&#34;优化&#34;你试试。

答案 2 :(得分:0)

众所周知,无论缓存与否,一次内存提取速度都快于两次。对于任何大于10行的程序,我也几乎可以保证last_ptrfirst_ptr are不在寄存器中。

您的if(!list_empty)可能是if(!list_empty())的两倍。如果将其应用于整个程序,则意味着手机的电池续航时间延长一倍,数据中心的服务器数量减少一半,等等。)

但是当然你需要考虑pop_back()次呼叫的数量(这将会更慢)与if(!list_empty)的数量相比(这会更快)。