【算法】Vector,array, 传统数组速度的比较

-1:特别鸣谢

@L_T_F_:提供 Windows 下的 debug 和 release 的数据

@东北小蟹蟹:提供 Linux 下的数据

其他阅读链接:https://www.cnblogs.com/sdltf/p/12841544.html

0:一些声明

作者的电脑信息:

这篇文章所用的 IDE:VS2019 最新版

VS2019 所建立的项目:控制台项目

linux 下的测试由 @东北小蟹蟹 提供,感谢。

本文提到的所有数据均为 5 次试验

所有的平均值均检验过

本位作者并无挑拨离间的意思,只是一时兴起想做个测试

如果哪里有问题,请在下边留言~

1:为什么要写这篇文章

@L_T_F_一天跟我发了一段 QQ 聊天的截图,具体内容是关于 vector 和数组的运行速度的争论。

我一时也觉得很好玩,这里还是不不放上聊天截图了。

于是,这篇文章就诞生了。

2:准备工作

本次分为两种方式判定速度:

– Debug 模式

– Release 模式

每个模式下会有四个不同的测试方式,分别为:

– 循环赋值

– 加法运算

– 乘法运算

– 随机访问

测评之前并没有考虑到除法和%,但是好像这两个是更慢的……

测评也没有考虑到位运算,因为位运算挺快的。

如果你有兴趣你也可以试试。

他们对应的代码分别为:

for(int i = 0;i < n;i ++) xxx[i] = 0;

for(int i = 1;i < n;i ++) xxx[i] = xxx[i-1]+rand()%10;

for(int i = 1;i < n;i ++) xxx[i] = xxx[i-1]*rand()%10;

for(int i = 0;i < n;i ++) xxx[i];//真·我只是访问一下

其中,xxx 为 unsigned long long 类型,$n = (1e5)^2$

注:数组大小只有 $1e5$,这里的 $n$只是循环次数。

时间单位:s

储存时间的数据类型:long double

小数位数:四舍五入到第三位

rand:并没有随机数种子

3:在 Windows 下

3.1.2:Debug 下的赋值

Debug 下的赋值所需时间:

项目

传统数组

vector

array

第一次

0.008

0.091

0.089

第二次

0.007

0.167

0.075

第三次

0.006

0.165

0.093

第四次

0.006

0.070

0.079

第五次

0.006

0.119

0.075

平均值

0.066

0.122

0.082

最大值

0.008

0.167

0.093

最小值

0.007

0.070

0.075

从这里可以看出,所需时间 $\texttt{方括号数组}

3.1.2:Release 下的赋值

讲道理让我吃了一惊

项目

传统数组

vector

array

第一次

0.000

0.000

0.000

第二次

0.000

0.000

0.000

第三次

0.000

0.000

0.000

第四次

0.000

0.000

0.000

第五次

0.000

0.000

0.000

平均值

0.000

0.000

0.000

最大值

0.000

0.000

0.000

最小值

0.000

0.000

0.000

讲道理,我怀疑我电脑出了问题……

3.2.1:Debug 下的加法运算

如下表:

项目

传统数组

vector

array

第一次

0.116

0.205

0.131

第二次

0.069

0.182

0.184

第三次

0.079

0.150

0.151

第四次

0.097

0.156

0.130

第五次

0.077

0.155

0.185

平均值

0.087

0.169

0.156

最大值

0.116

0.205

0.185

最小值

0.097

0.155

0.130

这个时候,传统方括号数组依然遥遥领先,vector 略逊色于 array

3.2.2:Release 下的加法运算

如下表,来吧,传说中的 0ms……

项目

传统数组

vector

array

第一次

0.000

0.004

0.005

第二次

0.000

0.005

0.007

第三次

0.000

0.005

0.006

第四次

0.000

0.007

0.005

第五次

0.000

0.006

0.005

平均值

0.000

0.005(0.0054)

0.006(0.0056)

最大值

0.000

0.007

0.007

最小值

0.000

0.004

0.005

这里 array 和 vector 其实也不分上下,但是方括号带来的 0ms 的确是杠杠滴……

3.3.1:Debug 下的乘法运算

差距逐渐的拉开了:

项目

传统数组

vector

array

第一次

0.067

0.923

0.719

第二次

0.700

0.788

0.847

第三次

0.673

0.791

0.781

第四次

0.829

0.812

0.821

第五次

0.510

0.703

0.785

平均值

0.676

0.803

0.790

最大值

0.829

0.923

0.847

最小值

0.067

0.703

0.719

传统数组依然是很快的,这个时候 array 和 vector 来开差距了~

3.3.2:Release 下的乘法运算

项目

传统数组

vector

array

第一次

0.097

0.923

0.719

第二次

0.070

0.788

0.847

第三次

0.123

0.791

0.781

第四次

0.141

0.812

0.821

第五次

0.770

0.703

0.785

平均值

0.240

0.803

0.790

最大值

0.770

0.923

0.847

最小值

0.070

0.703

0.719