-1:特別鳴謝
@L_T_F_:提供Windows下的debug和release的數據
@東北小蟹蟹:提供Linux下的數據
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.141 | 0.923 | 0.847 |
最小值 | 0.970 | 0.703 | 0.719 |