#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;
полностью удалите строку, время выполнения останется примерно таким же.