1. 程式人生 > >關於拷貝常規陣列、std::array和std::vector速度的一些測試

關於拷貝常規陣列、std::array和std::vector速度的一些測試

最近在寫一些有關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也是很快的。

實際的計算中,一億個局面的情況,耗費時間的可能不是複製操作了,應該是背後其它的一些計算,複製的時間開銷可以不計。因此一般不必考慮複製浪費的時間。編譯優化一旦開啟,速度會更快。