天天看點

多重 for 循環,如何提高效率?

前言

  我在《華為 c 語言程式設計規範》中看到了這個:當使用多重循環時,應該将最忙的循環放在最内層。如下圖:

多重 for 循環,如何提高效率?

  由上述很簡單的僞代碼可以看到,推薦使用的方式是:外小内大的方式。也就是内層循環是最忙的。

  然後我又在另外一份程式設計規範手冊中,看到了類似的要求,如下圖:

多重 for 循環,如何提高效率?

  看到了這個小技巧之後,我迫不及待的分享給我的小夥伴,後來閑下來的時候,就想自己做個測試,驗證一下是否真的是這樣。

ubuntu 測試

  使用 ubuntu 14.04 的系統進行測試,基本資訊如下:

系統版本:ubuntu14.04

gcc 版本:4.8.2

  我使用了兩份不同的代碼檔案進行測試,第一份是 外大内小 的代碼,如下:

  執行上述代碼,運作結果如下,耗時:165280us

多重 for 循環,如何提高效率?

  接着,我又準備了另外一份 外小内大 的代碼,對比隻是調換了 for 循環内外層的循環次數而已,如下:

  上述代碼的執行結果如下,耗時:155960us

多重 for 循環,如何提高效率?

  對比上述兩份代碼的運作結果,可以很明顯的看到,外小内大效率更高一點!

  不過,你以為這就結束了嗎?

樹莓派測試

  手邊剛好有一台樹莓派,前段時間剛安裝了最新的官方系統,就想着拿來做一下測試,基本資訊如下:

樹莓派系統版本:buster

多重 for 循環,如何提高效率?
多重 for 循環,如何提高效率?

g++ 版本:8.3.0

多重 for 循環,如何提高效率?

  測試代碼與在 ubuntu 上運作的代碼保持一緻,這裡就不重複貼代碼了,隻看一下運作結果。

  下邊這個是 外大内小 的,運作結果如下,耗時:1214569us

多重 for 循環,如何提高效率?

  這個是 外小内大 的,運作結果如下,耗時:1345193us

多重 for 循環,如何提高效率?

  完了,可以很明顯的看到,外大内小 的運作效率要更高一點。

問題分析

  我也是有點蒙逼的,不知道為啥會出現截然相反的情況,對比兩個系統版本,硬體裝置來看,推測原因有如下幾種可能:

處理器架構不同

ubuntu 是安裝在 win10 桌上型電腦上的虛拟機中,所使用的硬體應該為桌上型電腦的硬體(處理器等);而桌上型電腦的硬體是英特爾的 x86 架構的處理器。

樹莓派使用的硬體平台,是一個 arm 架構的晶片,具體可以參考圖檔:

多重 for 循環,如何提高效率?

圖檔來源:樹莓派實驗室

gcc 版本不同,在剛開始操作的時候,也詳細的列出了目前程式使用的環境

ubuntu14.04 中 gcc  版本為:4.8.2

樹莓派中 gcc 版本為:8.3.0

  目前能想到的差異就這麼多,其他的暫時還不知道,難道這個就是運作在 x86 平台和 arm 平台的差別之一?更多的更深入的研究還有待後續學習研究才能知道。今天的讨論就到這裡為止吧!

總結

在 x86 架構平台下,外小内大效率較高;

由于參考的規範手冊,可能是用于伺服器開發,而伺服器仍然是 x86 架構的處理器居多,是以 for 循環的多重循環規則較适用;

需要考慮在嵌入式等 arm 平台下,此規則是否同樣适用,是否還有其他應用場景限制等?

多重 for 循環,如何提高效率?