当我想确保要使用的条目存在时,我通常会这样做。
#include <unordered_map>
struct type { int member; };
std::unordered_map<type> map;
if (map.find(key) != map.end())
    map[key].member = 42;但是,我认为它在哈希映射中对key执行两次查找。这就隐藏了查找。
#include <unordered_map>
struct type { int member; };
std::unordered_map<type> map;
auto find = map.find(key);
if (find != map.end())
    find->second.member = 42;第一种选择感觉更有表现力。真的慢了吗?
发布于 2014-09-20 15:21:55
是的,因为您搜索了两次密钥:map[key]搜索的密钥与map.find完全一样,您丢弃了结果。
这就像打开抽屉看是否有一个给定的物体,说“啊是的!”然后关闭抽屉,然后再打开它,并研究对象来改变它。
第二个代码打开抽屉,搜索一个对象并修改它。
可以进行编译器优化,以避免重复搜索,或者可以在恒定时间内减少搜索,还可以进行编译器优化,以避免将auto find变量存储在内存中(可以是CPU寄存器,因为它的使用非常本地)。
整个问题实际上将减少两次哈希计算的时间(并在哈希冲突情况下遍历最终的映射槽)和访问额外变量的时间:
2*H < H+M意思是H < M。如果M是一个寄存器,H不是平凡的,那么H很难小于M。
发布于 2014-09-20 15:21:58
它可能会慢一些,但它可能不会(您现在正在“加速”中进行额外的编写),但是在编写代码时真的不应该担心这么小的优化。写出清晰的表达代码。如果你的程序真的太慢了,在上面运行分析工具,找出你的瓶颈。如果这段代码实际上是一个真正的问题,那么只需尝试“加速”,看看它是否重要。
发布于 2014-09-20 17:54:04
是的,它可能会慢一些,但可能不会明显地慢下来。还需要做一些额外的工作:
因此,总结一下,如果:
那你可能会看到不同之处。
作为最后一个词-它可能不会重要,这不是很大的架构差异,而是5s优化。因此,编写任何您认为更容易维护和重新讨论的问题,当分析器将显示该功能会导致减速。
https://stackoverflow.com/questions/25950207
复制相似问题