-1:特别鸣谢

@L_T_F_:提供 Windows 下的 debug 和 release 的数据
@东北小蟹蟹:提供 Linux 下的数据
其他阅读链接:https://www.cnblogs.com/sdltf/p/12841544.html


0:一些声明

  1. 作者的电脑信息:
    message

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

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

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

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

  6. 所有的平均值均检验过

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

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


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];//真·我只是访问一下

其中,xxxunsigned 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{方括号数组}<array<vector$

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

这里 arrayvector 其实也不分上下,但是方括号带来的 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

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

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
分类: 文章

SDLTF

Less is More

1 条评论

boshi · 2020年6月6日 4:06 下午

3.3.2 的普通数组最大值和最小值是否写反了呢

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注