在 unordered_map 中 "find" 和 "at" 哪个更快?
Which one is faster "find" or "at" in unordered_map?
我知道对于无序映射,"find" returns 是一个迭代器,而 "at" returns 是映射值。我只是好奇哪个更快。
以下是VS2015社区中两个函数的源码
iterator find(const key_type& _Keyval)
{ // find an element in mutable hash table that matches _Keyval
return (lower_bound(_Keyval));
}
mapped_type& at(const key_type& _Keyval)
{ // find element matching _Keyval
iterator _Where = _Mybase::lower_bound(_Keyval);
if (_Where == _Mybase::end())
_Xout_of_range("invalid unordered_map<K, T> key");
return (_Where->second);
}
如你所见,它们几乎相同,应该具有相同的性能。
的文档
可以看到复杂度为:
Average case: constant.
Worst case: linear in container size.
你不应该根据速度在两者之间进行选择,选择更能表达你意图的方法。当您使用 at
时,您假设该元素在地图中(否则会出现异常)。 find
情况并非如此。
find
更可能是 noexcept。在某些 compilers/platforms 中,noexcept 函数可以在代码大小上变得更快或更简单,因为不必设置异常 setup/catch/etc。
如果你找到了,如果找不到则抛出,你会得到无法区分的结果。如果你在,然后捕获和分支,你可能会比查找慢(如果编译器没有优化 throw/catch 不存在)。
差异会很小,因此您应该根据其他考虑来选择调用哪个,除非代码对性能至关重要。在那种情况下,profile and teat,不要依赖理论或微基准。
我知道对于无序映射,"find" returns 是一个迭代器,而 "at" returns 是映射值。我只是好奇哪个更快。
以下是VS2015社区中两个函数的源码
iterator find(const key_type& _Keyval)
{ // find an element in mutable hash table that matches _Keyval
return (lower_bound(_Keyval));
}
mapped_type& at(const key_type& _Keyval)
{ // find element matching _Keyval
iterator _Where = _Mybase::lower_bound(_Keyval);
if (_Where == _Mybase::end())
_Xout_of_range("invalid unordered_map<K, T> key");
return (_Where->second);
}
如你所见,它们几乎相同,应该具有相同的性能。
可以看到复杂度为:
Average case: constant. Worst case: linear in container size.
你不应该根据速度在两者之间进行选择,选择更能表达你意图的方法。当您使用 at
时,您假设该元素在地图中(否则会出现异常)。 find
情况并非如此。
find
更可能是 noexcept。在某些 compilers/platforms 中,noexcept 函数可以在代码大小上变得更快或更简单,因为不必设置异常 setup/catch/etc。
如果你找到了,如果找不到则抛出,你会得到无法区分的结果。如果你在,然后捕获和分支,你可能会比查找慢(如果编译器没有优化 throw/catch 不存在)。
差异会很小,因此您应该根据其他考虑来选择调用哪个,除非代码对性能至关重要。在那种情况下,profile and teat,不要依赖理论或微基准。