ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于拷贝常规数组、std::array和std::vector速度的一些测试

2021-09-07 09:05:30  阅读:242  来源: 互联网

标签:std 10 clock high vector array include resolution


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

实际的计算中,一亿个局面的情况,耗费时间的可能不是复制操作了,应该是背后其它的一些计算,复制的时间开销可以不计。因此一般不必考虑复制浪费的时间。编译优化一旦开启,速度会更快。

标签:std,10,clock,high,vector,array,include,resolution
来源: https://blog.csdn.net/qq_45662588/article/details/120140522

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有