-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{方括号数组}<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 |
这里 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 |
1 条评论
boshi · 2020年6月6日 4:06 下午
3.3.2 的普通数组最大值和最小值是否写反了呢