Эффективность конструктора на основе диапазона контейнеров - PullRequest
0 голосов
/ 27 мая 2019

Выполняя некоторый тест на веб-сайте с вызовом алгоритма, я столкнулся с этой проблемой, когда мой 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);
    }
}

Как это объяснить?

1 Ответ

1 голос
/ 27 мая 2019

Я сделал простой тест:

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

...