前言
我在《華為 c 語言程式設計規範》中看到了這個:當使用多重循環時,應該将最忙的循環放在最内層。如下圖:
由上述很簡單的僞代碼可以看到,推薦使用的方式是:外小内大的方式。也就是内層循環是最忙的。
然後我又在另外一份程式設計規範手冊中,看到了類似的要求,如下圖:
看到了這個小技巧之後,我迫不及待的分享給我的小夥伴,後來閑下來的時候,就想自己做個測試,驗證一下是否真的是這樣。
ubuntu 測試
使用 ubuntu 14.04 的系統進行測試,基本資訊如下:
系統版本:ubuntu14.04
gcc 版本:4.8.2
我使用了兩份不同的代碼檔案進行測試,第一份是 外大内小 的代碼,如下:
執行上述代碼,運作結果如下,耗時:165280us
接着,我又準備了另外一份 外小内大 的代碼,對比隻是調換了 for 循環内外層的循環次數而已,如下:
上述代碼的執行結果如下,耗時: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 平台下,此規則是否同樣适用,是否還有其他應用場景限制等?