c++ - 基于容器范围的构造函数效率
问题描述
在算法挑战网站上进行一些测试时,我遇到了这个问题,我std::unordered_set
在使用 range-base init 时(有点)减慢了我的速度:
void test(vector<int>& nums1) {
unordered_set<int> set1(nums1.begin(), nums1.end());
}
慢于
vector<int> test(vector<int>& nums1) {
unordered_set<int> set1;
for (auto num : nums1) {
set1.insert(num);
}
}
这要怎么解释?
解决方案
我做了一个简单的基准测试:
--------------------------------------------------------------------
Benchmark Time CPU Iterations
--------------------------------------------------------------------
from_range<int>/256 13998 ns 13998 ns 50128
from_inserts<int>/256 16543 ns 16542 ns 41822
from_range<int>/512 27573 ns 27573 ns 25060
from_inserts<int>/512 36691 ns 36691 ns 19426
from_range<int>/4096 246584 ns 246584 ns 2881
from_inserts<int>/4096 335115 ns 335111 ns 2111
from_range<int>/32768 2401152 ns 2401123 ns 291
from_inserts<int>/32768 3398496 ns 3398509 ns 204
from_range<int>/262144 29351062 ns 29351113 ns 23
from_inserts<int>/262144 52871572 ns 52871542 ns 12
from_range<int>/1048576 245771472 ns 245772469 ns 3
from_inserts<int>/1048576 445421451 ns 445415603 ns 2
编译g++ -O3 -m64 -march=native
,GCC 版本 8.3.0。
推荐阅读
- android - 自定义视图接收 Activity/Fragment 生命周期回调?
- scala - Spark-Scala:Spark Scala 中的增量数据加载以及唯一 ID 的生成
- reactjs - 如何在页面打开后从 cookie 中正确设置属性(如果用户已登录)或使用路由器和 redux 在 React 中使用 F5
- node.js - 使用 create-react-app 和 node 设置 jest 多项目
- c# - 启动Windows服务的正确方法
- java - 从 C++ 到 C++ 回调的 Java 回调
- javascript - .Net:将值从 JavaScript 传递到 C# 而无需回发
- dfsort - 使用 JCL 屏蔽中间数字
- python - Python中的类问题连接SQL Server
- laravel - Laravel - 使用 php artisan make:migration 一次将两列添加到现有表中