關於拷貝常規陣列、std::array和std::vector速度的一些測試
阿新 • • 發佈:2018-12-13
最近在寫一些有關AI的演算法,需要的一些資料結構要用到複製的操作。因此在這裡測試了一下各種資料的複製速度,編譯器支援C++11/14。
#include <iostream>
#include <chrono>
#include <cstring>
#include <algorithm>
#include <array>
#include <vector>
using std::chrono::high_resolution_clock;
using std::chrono::milliseconds;
int main () {
int Board[10][10] = {0}, tmp[10][10] = {0};
std::array<std::array<int, 10>, 10>ABoard, Atmp;
unsigned long long N = 10000000;
// 複製陣列
high_resolution_clock::time_point beginTime = high_resolution_clock::now();
for(unsigned long long i = 0; i < N; ++i) {
std::copy(ABoard. begin(), ABoard.end(), Atmp.begin());
}
high_resolution_clock::time_point endTime = high_resolution_clock::now();
milliseconds timeInterval = std::chrono::duration_cast<milliseconds>(endTime - beginTime);
std::cout << "array=" << timeInterval.count() << "ms\n" ;
// 複製vector
std::vector<std::vector<int>>vec(10, std::vector<int>(10)), vec1(10, std::vector<int>(10));
beginTime = high_resolution_clock::now();
for(unsigned long long i = 0; i < N; ++i) {
// vec.assign(vec1.begin(),vec1.end()); // 時間特別長,大約是array的20倍
vec1 = vec; // 與assign類似
// vec.swap(vec1); // 與Array類似
}
endTime = high_resolution_clock::now();
timeInterval = std::chrono::duration_cast<milliseconds>(endTime - beginTime);
std::cout << "vector=" << timeInterval.count() << "ms\n";
// C語言方式的快速寫入
beginTime = high_resolution_clock::now();
for(unsigned long long i = 0; i < N; ++i) {
memcpy(Board, tmp, 10 * 10 * sizeof(int));
}
endTime = high_resolution_clock::now();
timeInterval = std::chrono::duration_cast<milliseconds>(endTime - beginTime);
std::cout << "memcpy=" << timeInterval.count() << "ms\n";
}
/*
未開優化:
array=466ms
vector=7923ms
memcpy=198ms
*/
/*
-O3優化,最高速度:
array=0ms
vector=453ms
memcpy=0ms
*/
因此,如果想要追求最快速度,那麼儘量使用memcpy
這個方式。即使增加到一億個10*10的整型陣列,速度1948ms也是很快的。
實際的計算中,一億個局面的情況,耗費時間的可能不是複製操作了,應該是背後其它的一些計算,複製的時間開銷可以不計。因此一般不必考慮複製浪費的時間。編譯優化一旦開啟,速度會更快。