【问题标题】:Container range based constructor efficiency基于容器范围的构造函数效率
【发布时间】:2019-05-27 17:40:13
【问题描述】:

在算法挑战网站上进行一些测试时,我遇到了这个问题,我的std::unordered_set 在使用基于范围的 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);
    }
}

如何解释?

【问题讨论】:

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

标签: c++ algorithm vector stl set


【解决方案1】:

我做了一个简单的基准测试:

--------------------------------------------------------------------
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

Source code

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

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多