多重 for 循环,如何提高效率?
2258?字 14 圖 :?文章字數
6 分鐘 :?預計閱讀
網絡 : 內容來源
BabyCoder :?編輯整理
前言
??我在《華為 C 語言編程規范》中看到了這個:當使用多重循環時,應該將最忙的循環放在最內層。如下圖:
??由上述很簡單的偽代碼可以看到,推薦使用的方式是:外小內大的方式。也就是內層循環是最忙的。
??然后我又在另外一份編程規范手冊中,看到了類似的要求,如下圖:
??看到了這個小技巧之后,我迫不及待的分享給我的小伙伴,后來閑下來的時候,就想自己做個測試,驗證一下是否真的是這樣。
Ubuntu 測試
??使用 Ubuntu 14.04 的系統進行測試,基本信息如下:
系統版本:Ubuntu14.04
gcc 版本:4.8.2
??我使用了兩份不同的代碼文件進行測試,第一份是 外大內小 的代碼,如下:
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#include <unistd.h> using namespace std; int main(){ struct timeval tv; unsigned long ulStartTime, ulEndTime;gettimeofday(&tv, NULL); // 獲取當前時間 ulStartTime = tv.tv_sec * 1000000 + tv.tv_usec; // 計算當前起始時間 cout << "start time = " << ulStartTime << endl; // 打印顯示 for(unsigned int i = 0; i < 1000000; i++) // 測試代碼 { for(int j = 0; j < 100; j++) { } } gettimeofday(&tv, NULL); ulEndTime = tv.tv_sec * 1000000 + tv.tv_usec; // 計算結束時間 cout << "end time = " << ulEndTime << endl; // 打印結束時間 cout << "Time = " << ulEndTime - ulStartTime << endl; // 計算時間差值 微秒 us}??執行上述代碼,運行結果如下,耗時:165280us
??接著,我又準備了另外一份 外小內大 的代碼,對比只是調換了 for 循環內外層的循環次數而已,如下:
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#include <unistd.h> using namespace std; int main(){ struct timeval tv; unsigned long ulStartTime, ulEndTime;gettimeofday(&tv, NULL); ulStartTime = tv.tv_sec * 1000000 + tv.tv_usec; cout << "start time = " << ulStartTime << endl; for(int i = 0; i < 100; i++) { for(unsigned int j = 0; j < 1000000; j++) {} } gettimeofday(&tv, NULL); ulEndTime = tv.tv_sec * 1000000 + tv.tv_usec; cout << "end time = " << ulEndTime << endl; cout << "Time = " << ulEndTime - ulStartTime << endl;}??上述代碼的執行結果如下,耗時:155960us
??對比上述兩份代碼的運行結果,可以很明顯的看到,外小內大效率更高一點!
??不過,你以為這就結束了嗎?
樹莓派測試
??手邊剛好有一臺樹莓派,前段時間剛安裝了最新的官方系統,就想著拿來做一下測試,基本信息如下:
樹莓派系統版本:buster
g++ 版本:8.3.0
??測試代碼與在 Ubuntu 上運行的代碼保持一致,這里就不重復貼代碼了,只看一下運行結果。
??下邊這個是 外大內小 的,運行結果如下,耗時:1214569us
??這個是 外小內大 的,運行結果如下,耗時:1345193us
??完了,可以很明顯的看到,外大內小 的運行效率要更高一點。
問題分析
??我也是有點蒙逼的,不知道為啥會出現截然相反的情況,對比兩個系統版本,硬件設備來看,推測原因有如下幾種可能:
處理器架構不同
Ubuntu 是安裝在 win10 臺式機上的虛擬機中,所使用的硬件應該為臺式機的硬件(處理器等);而臺式機的硬件是英特爾的 X86 架構的處理器。
樹莓派使用的硬件平臺,是一個 ARM 架構的芯片,具體可以參考圖片:
gcc 版本不同,在剛開始操作的時候,也詳細的列出了當前程序使用的環境
Ubuntu14.04 中 gcc ?版本為:4.8.2
樹莓派中 gcc 版本為:8.3.0
??目前能想到的差異就這么多,其他的暫時還不知道,難道這個就是運行在 X86 平臺和 ARM 平臺的區別之一?更多的更深入的研究還有待后續學習研究才能知道。今天的討論就到這里為止吧!
總結
在 X86 架構平臺下,外小內大效率較高;
由于參考的規范手冊,可能是用于服務器開發,而服務器仍然是 X86 架構的處理器居多,因此 for 循環的多重循環規則較適用;
需要考慮在嵌入式等 ARM 平臺下,此規則是否同樣適用,是否還有其他應用場景限制等?歡迎私信/加我好友一起討論~
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
總結
以上是生活随笔為你收集整理的多重 for 循环,如何提高效率?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Administration inter
- 下一篇: Servlet面试题汇总