C++ 基于容器范围的构造函数效率

C++ 基于容器范围的构造函数效率,c++,algorithm,vector,stl,set,C++,Algorithm,Vector,Stl,Set,在一个算法挑战网站上进行测试时,我遇到了这个问题,我的std::unordered_set在使用range base init时(稍微)减慢了我的速度: 无效测试(向量和nums1){ 无序集合set1(nums1.begin(),nums1.end()); } 慢于 向量测试(向量和nums1){ 无序集set1; 用于(自动编号:nums1){ set1.插入(num); } } 如何解释这一点?我做了一个简单的基准测试: --------------------------------

在一个算法挑战网站上进行测试时,我遇到了这个问题,我的
std::unordered_set
在使用range base init时(稍微)减慢了我的速度:

无效测试(向量和nums1){
无序集合set1(nums1.begin(),nums1.end());
}
慢于

向量测试(向量和nums1){
无序集set1;
用于(自动编号:nums1){
set1.插入(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
--------------------------------------------------------------------
基准时间CPU迭代
--------------------------------------------------------------------
从\u范围/256 13998 ns 13998 ns 50128
从U插件/256 16543 ns 16542 ns 41822
从_范围/512 27573 ns 27573 ns 25060
来自_inserts/512 36691 ns 36691 ns 19426
自量程/4096 246584 ns 246584 ns 2881
来自_插件/4096 335115 ns 335111 ns 2111
从_范围/32768 2401152 ns 2401123 ns 291
来自_插件/32768 3398496 ns 3398509 ns 204
从_范围/262144 29351062 ns 29351113 ns 23
来自_插件/262144 52871572 ns 52871542 ns 12
从_范围/1048576 245771472 ns 245772469 ns 3
来自_插件/1048576 445421451 ns 44541503 ns 2


使用GCC 8.3.0版的
g++-O3-m64-march=native
编译。

在询问性能度量时,请显示完整的基准代码(包括使用的编译器优化级别)。这两个测试使用相同的数据集(即nums1在两个基准测试中完全相同,我的意思不是大小,而是向量的内容)?您的第二个
测试
有一个非
无效
返回类型,并且不
返回
。这也是两个函数之间的差异。在进行基准测试时,除了您想要测量的内容外,尽量保持所有内容完全相同。