缓存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。矢量只是一个很好的例子。这种逻辑可以出现在另一种情况下。
答案 0 :(得分:8)
鉴于现代积极的编译器优化,我们不应该浪费时间来担心这些琐事,但是如果你必须:通过分析器运行每个版本并亲自看看哪个更快以及如何得多。
答案 1 :(得分:1)
除std::forward_list
之外的所有标准容器都有size()
的恒定时间,因此empty()
(std::forward_list
只有empty()
的固定成本。
因此,对自己进行缓存对性能有负面影响(或至少没有正面影响)。
不要忘记&#34; as-if&#34; -rule及其异常:只要编译的程序对任何已定义的行为具有相同的可观察行为(或者更改是由异常覆盖),编译器可以进行任何想要的转换。
无论如何,如果在测量之后你确定了代码太慢的地方,首先要尝试更好的算法,然后测量每个&#34;优化&#34;你试试。
答案 2 :(得分:0)
众所周知,无论缓存与否,一次内存提取速度都快于两次。对于任何大于10行的程序,我也几乎可以保证last_ptr
和first_ptr are
不在寄存器中。
您的if(!list_empty)
可能是if(!list_empty())
的两倍。如果将其应用于整个程序,则意味着手机的电池续航时间延长一倍,数据中心的服务器数量减少一半,等等。)
但是当然你需要考虑pop_back()
次呼叫的数量(这将会更慢)与if(!list_empty)
的数量相比(这会更快)。