std :: copy медленнее для указанного диапазона c, но такой же, как memcpy без диапазона - PullRequest
0 голосов
/ 02 марта 2020

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



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...