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()
,将会有所改善。
如果我的理解是错误的,有人可以澄清这一点吗?
除非经过衡量,否则谈论性能损失/收益的任何事情都是毫无意义的。当然,第一个版本在理论上更快,但只有测量才能显示理论的相关性。
说 - 在我看来,更改的重点是使逻辑明确 - 如果地图中不存在值,则分配值或插入。将operator[]
与std::map
一起使用是该语言中更令人讨厌的怪癖之一。自 C++17 以来,有专门的方法 -insert_or_assign
它的速度与emplace
或insert
一样快。
相关文章:
- 哪种方法更好,性能明智
- 不同的类或结构初始化方法之间的性能差异是什么?
- std::map 索引运算符与插入方法的性能
- 在.cpp文件中定义方法而不是在 C++ 的 .h 文件中定义方法时,如何提高代码的性能?
- 在类实例或方法的上下文中调用函数以进行性能分析
- 检查从查询返回的任何行是否包含在字符串中的最高性能方法?
- Union-Find方法性能,迭代与递归
- 虚拟方法与std ::功能成员变量在性能方面
- 是否有更好的方法(性能提高 /内置功能)获得矩形的旋转角度
- 类方法VS类静态函数VS简单函数-性能方面
- 清除rwtexture2d的大多数性能方法
- boost::asio::strand post方法性能
- 将特征矩阵转换为 c 数组以便我可以使用 gsl 的性能高效方法是什么
- 这种错误检查方法的性能会不会太高
- 为性能库制作高效包装器的智能方法
- 就百分比而言,这两种方法之间的平均性能差异有多大
- 无法为C++方法添加性能探测
- Linux 性能监控,任何监视每个线程的方法
- 初始化方法与构造函数加赋值的方法——性能有什么不同?(C++)
- 测试值是否在阈值范围内的最佳方法(性能方面)是什么