std::map 索引运算符与插入方法的性能
Performance of std::map index operator vs insert method
我最近看到拉取请求中的更改。我想知道这是否有任何改善。
以下为简化版。
...
std::map<int, std::string> myMap;
... // map will get updated
void foo(int key, std::string value)
{
myMap[key] = value; // <-- this line gets changed
}
标记的单行修改如下
auto entry = myMap.find(key);
if (entry == myMap.end())
{
myMap.insert(std::make_pair(key, value));
}
else
{
entry->second = value;
}
可能是为了避免在 key
不存在时创建对象(这似乎是一个有效的观点)。但是在 insert()
调用中没有创建类似的临时对象吗?或者这里会发生某种优化?
在我看来,两个版本应该具有相同的性能。但是如果用emplace()
代替insert()
会有改善。
如果我的理解有误,谁能澄清一下?
除非经过衡量,否则谈论性能 lose/gains 是毫无意义的。当然,第一个版本在理论上更快,但只有测量才能显示相关理论的相关性。
也就是说 - 在我看来,更改的重点是使逻辑明确 - 如果地图中不存在值,则分配值或插入。 operator[]
与 std::map
的用法是该语言最讨厌的怪癖之一。由于 C++17 有专门的方法 - insert_or_assign
与 emplace
或 insert
.
一样快
我最近看到拉取请求中的更改。我想知道这是否有任何改善。
以下为简化版。
...
std::map<int, std::string> myMap;
... // map will get updated
void foo(int key, std::string value)
{
myMap[key] = value; // <-- this line gets changed
}
标记的单行修改如下
auto entry = myMap.find(key);
if (entry == myMap.end())
{
myMap.insert(std::make_pair(key, value));
}
else
{
entry->second = value;
}
可能是为了避免在 key
不存在时创建对象(这似乎是一个有效的观点)。但是在 insert()
调用中没有创建类似的临时对象吗?或者这里会发生某种优化?
在我看来,两个版本应该具有相同的性能。但是如果用emplace()
代替insert()
会有改善。
如果我的理解有误,谁能澄清一下?
除非经过衡量,否则谈论性能 lose/gains 是毫无意义的。当然,第一个版本在理论上更快,但只有测量才能显示相关理论的相关性。
也就是说 - 在我看来,更改的重点是使逻辑明确 - 如果地图中不存在值,则分配值或插入。 operator[]
与 std::map
的用法是该语言最讨厌的怪癖之一。由于 C++17 有专门的方法 - insert_or_assign
与 emplace
或 insert
.