Почему перемещение-присвоение вектора std::, по-видимому, не имеет никакого преимущества в производительности по сравнению с копированием в этом коде?

#c 11 #stdvector #move-semantics #stdmove

Вопрос:

Поскольку назначение перемещения std::vector- O(1) это операция по времени, а копирование вектора std::в другой is O(N) (где N-сумма размеров 2 векторов), я ожидал, что назначение перемещения будет иметь значительное преимущество в производительности по сравнению с копированием. Чтобы проверить это, я написал следующий код, который перемещает/копирует вектор std:: nums2 размером от 1000 до nums 100 000 раз.

 #include <iostream>
#include <vector>
#include <chrono>

using namespace std;

int main()
{
    auto start = clock();

    vector <int> nums;
    for(int i = 0; i < 100000;   i) {

        vector <int> nums2(1000);
        for(int i = 0; i < 1000;   i) {
            nums2[i] = rand();
        }

        nums = nums2; // or nums = move(nums2);

        cout << (nums[0] ? 1:0) << "b b"; // prevent compiler from optimizing out nums (I think)
    }

    cout << "Time: " << (clock() - start) / (CLOCKS_PER_SEC / 1000) << 'n';

    return 0;
}

 

Компилятор , который я использую,-g 7.5.0. При работе с g -std=c 1z -O3 обеими версиями move-assign/copy требуется около 1600 мс, что не соответствует гипотезе о том, что назначение перемещения имеет какое-либо существенное преимущество в производительности. Затем я протестировал использование std::swap(nums, nums2) (в качестве альтернативы назначению перемещения), но это также заняло примерно столько же времени.

Итак, мой вопрос в том, почему назначение вектора std::другому, по-видимому, не дает преимущества в производительности по сравнению с назначением копирования? Есть ли у меня фундаментальная ошибка в моем понимании назначения перемещения C ?

Комментарии:

1. Не засекайте время печати. Возможно, именно там проводится большая часть времени?

2. На самом деле вы не измеряете векторное копирование или перемещение — они занимают небольшую часть общего времени выполнения, легко теряясь в шуме. Вы в основном измеряете rand() вызовы и cout выходные данные. Я подозреваю, что, если вы nums = nums2; полностью удалите строку, время выполнения останется примерно таким же.