dan*_*jar 15 c++ lookup performance unordered-map
当我想确保我想要使用的条目存在时,我通常会这样做.
#include <unordered_map>
struct type { int member; };
std::unordered_map<type> map;
if (map.find(key) != map.end())
map[key].member = 42;
Run Code Online (Sandbox Code Playgroud)
但是,我认为它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;
Run Code Online (Sandbox Code Playgroud)
第一种选择感觉更具表现力.它真的慢吗?
Pau*_*ans 22
它可能更慢,它可能不会(你现在正在"加速"中进行额外的写入)但是在编写代码时真的不应该担心这种小的优化.写清楚的表达代码.然后,如果您的程序确实太慢,请在其上运行分析工具并找到您的瓶颈.如果这个代码是实际上是一个真正的问题,然后才把试试你的"加快",看看它是否重要.
Emi*_*lia 15
是的,因为你搜索了两次密钥:map[key]搜索完全相同的密钥map.find,你扔掉了结果.
这就像打开一个抽屉,看看是否有一个给定的物体,说"啊是的!" 并关闭抽屉,然后再次打开它并研究对象进行更改.
第二个代码打开抽屉,搜索对象并进行更改.
可以存在允许避免双重搜索的编译器优化,或者可以在恒定时间内减少搜索的编译器优化,并且可以存在允许避免auto find变量存储在存储器上的编译器优化(它可以是CPU寄存器,因为它用法非常本地化).
整个问题实际上会减少两次哈希计算两次的时间(并且在哈希冲突的情况下遍历最终的映射槽)以及访问额外变量的时间:
2*H < H+M
Run Code Online (Sandbox Code Playgroud)
这意味着H < M.如果M是一个寄存器而H不是微不足道的,那么很难H小于M.
是的,它可能会比较慢,但可能不是可测量慢.还有一些额外的工作:
总结如果:
然后你可能会看到差异.
最后一句话 - 它可能无关紧要,它不是很大的架构差异,而是5s优化.因此,当分析器显示此功能导致速度减慢时,请编写更容易维护的内容并重新查看问题.
| 归档时间: |
|
| 查看次数: |
1034 次 |
| 最近记录: |