Я знаю, что разные компиляторы будут давать разные результаты. Я использую г cc. Я знаю, что std :: copy на самом деле использует memcpy, поэтому время выполнения std :: copy и memcpy должно быть одинаковым. Однако, это не похоже на использование back_inserter () в std :: copy, и это гораздо хуже, когда я использую диапазон в std :: copy.
Я получил следующий вывод с оптимизацией по умолчанию flag:
vector total push_back time: 28
total copy time using push_back: 18
std::copy with begin() time: 1
std::copy with back_inserter time: 13
memcpy time: 1
std::copy with begin() but with a range: 75
Однако время выполнения изменяется, когда я включаю флаг O3, но для копии диапазона, std :: copy все еще медленный.
vector total push_back time: 11
total copy time using push_back: 3
std::copy with begin() time: 0
std::copy with back_inserter time: 1
memcpy time: 1
std::copy with begin() but with limits: 64
Вот мой тест код:
#include <iostream>
#include <chrono>
#include <vector>
#include <algorithm>
#include <limits>
#include <cstring>
using namespace std;
int main(){
std::chrono::high_resolution_clock::time_point s = std::chrono::high_resolution_clock::now();
std::vector<int> v;
for(int i = 0; i < INT8_MAX; i++)
v.push_back(i);
std::chrono::high_resolution_clock::time_point e = std::chrono::high_resolution_clock::now();
int t = std::chrono::duration_cast<std::chrono::microseconds>(e - s).count();
cout<<"\n vector total push_back time: "<<t;
s = std::chrono::high_resolution_clock::now();
std::vector<int> v2;
for(int i = 0; i < INT8_MAX; i++){
v2.push_back(v[i]);
}
e = std::chrono::high_resolution_clock::now();
t = std::chrono::duration_cast<std::chrono::microseconds>(e - s).count();
cout<<"\n total copy time using push_back: "<<t;
s = std::chrono::high_resolution_clock::now();
std::vector<int> v3;
v3.reserve(v.size());
std::copy(v.begin(), v.end(), v3.begin());
e = std::chrono::high_resolution_clock::now();
t = std::chrono::duration_cast<std::chrono::microseconds>(e - s).count();
cout<<"\n std::copy with begin() time: "<<t;
s = std::chrono::high_resolution_clock::now();
std::vector<int> v5;
v5.reserve(v.size());
std::copy(v.begin(), v.end(), std::back_inserter(v5));
e = std::chrono::high_resolution_clock::now();
t = std::chrono::duration_cast<std::chrono::microseconds>(e - s).count();
cout<<"\n std::copy with back_inserter time: "<<t;
s = std::chrono::high_resolution_clock::now();
int* vec4 = new int[INT8_MAX];
::memcpy(vec4, v.data(), sizeof(int));
e = std::chrono::high_resolution_clock::now();
t = std::chrono::duration_cast<std::chrono::microseconds>(e - s).count();
cout<<"\n memcpy time: "<<t;
s = std::chrono::high_resolution_clock::now();
std::vector<int> v10;
v10.reserve(v.size());
static int a = 10000;
std::copy(v.begin(), v.begin()+ a, v10.begin());
e = std::chrono::high_resolution_clock::now();
t = std::chrono::duration_cast<std::chrono::microseconds>(e - s).count();
cout<<"\n std::copy with begin() but with a range: "<<t;
}