<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          多重 for 循環(huán),如何提高效率?

          共 733字,需瀏覽 2分鐘

           ·

          2020-12-23 08:12

          2258?字 14 圖 :?文章字?jǐn)?shù)

          6 分鐘 :?預(yù)計閱讀

          網(wǎng)絡(luò) : 內(nèi)容來源

          BabyCoder :?編輯整理




          前言

          ??我在《華為 C 語言編程規(guī)范》中看到了這個:當(dāng)使用多重循環(huán)時,應(yīng)該將最忙的循環(huán)放在最內(nèi)層。如下圖:

          ??由上述很簡單的偽代碼可以看到,推薦使用的方式是:外小內(nèi)大的方式。也就是內(nèi)層循環(huán)是最忙的。

          ??然后我又在另外一份編程規(guī)范手冊中,看到了類似的要求,如下圖:

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

          Ubuntu 測試

          ??使用 Ubuntu 14.04 的系統(tǒng)進(jìn)行測試,基本信息如下:

          • 系統(tǒng)版本:Ubuntu14.04
          • gcc 版本:4.8.2

          ??我使用了兩份不同的代碼文件進(jìn)行測試,第一份是 外大內(nèi)小 的代碼,如下:

          #include #include #include #include #include 
          using namespace std;
          int main(){ struct timeval tv; unsigned long ulStartTime, ulEndTime;
          gettimeofday(&tv, NULL); // 獲取當(dāng)前時間 ulStartTime = tv.tv_sec * 1000000 + tv.tv_usec; // 計算當(dāng)前起始時間 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; // 計算結(jié)束時間 cout << "end time = " << ulEndTime << endl; // 打印結(jié)束時間 cout << "Time = " << ulEndTime - ulStartTime << endl; // 計算時間差值 微秒 us}

          ??執(zhí)行上述代碼,運行結(jié)果如下,耗時:165280us

          ??接著,我又準(zhǔn)備了另外一份 外小內(nèi)大 的代碼,對比只是調(diào)換了 for 循環(huán)內(nèi)外層的循環(huán)次數(shù)而已,如下:

          #include #include #include #include #include 
          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;}

          ??上述代碼的執(zhí)行結(jié)果如下,耗時:155960us

          ??對比上述兩份代碼的運行結(jié)果,可以很明顯的看到,外小內(nèi)大效率更高一點!

          ??不過,你以為這就結(jié)束了嗎?

          樹莓派測試

          ??手邊剛好有一臺樹莓派,前段時間剛安裝了最新的官方系統(tǒng),就想著拿來做一下測試,基本信息如下:

          • 樹莓派系統(tǒng)版本:buster
          • g++ 版本:8.3.0

          ??測試代碼與在 Ubuntu 上運行的代碼保持一致,這里就不重復(fù)貼代碼了,只看一下運行結(jié)果。

          ??下邊這個是 外大內(nèi)小 的,運行結(jié)果如下,耗時:1214569us

          ??這個是 外小內(nèi)大 的,運行結(jié)果如下,耗時:1345193us

          ??完了,可以很明顯的看到,外大內(nèi)小 的運行效率要更高一點。

          問題分析

          ??我也是有點蒙逼的,不知道為啥會出現(xiàn)截然相反的情況,對比兩個系統(tǒng)版本,硬件設(shè)備來看,推測原因有如下幾種可能:

          • 處理器架構(gòu)不同

            • Ubuntu 是安裝在 win10 臺式機上的虛擬機中,所使用的硬件應(yīng)該為臺式機的硬件(處理器等);而臺式機的硬件是英特爾的 X86 架構(gòu)的處理器。
            • 樹莓派使用的硬件平臺,是一個 ARM 架構(gòu)的芯片,具體可以參考圖片:
          圖片來源:樹莓派實驗室
          • gcc 版本不同,在剛開始操作的時候,也詳細(xì)的列出了當(dāng)前程序使用的環(huán)境
            • Ubuntu14.04 中 gcc ?版本為:4.8.2
            • 樹莓派中 gcc 版本為:8.3.0

          ??目前能想到的差異就這么多,其他的暫時還不知道,難道這個就是運行在 X86 平臺和 ARM 平臺的區(qū)別之一?更多的更深入的研究還有待后續(xù)學(xué)習(xí)研究才能知道。今天的討論就到這里為止吧!

          總結(jié)

          1. 在 X86 架構(gòu)平臺下,外小內(nèi)大效率較高;
          2. 由于參考的規(guī)范手冊,可能是用于服務(wù)器開發(fā),而服務(wù)器仍然是 X86 架構(gòu)的處理器居多,因此 for 循環(huán)的多重循環(huán)規(guī)則較適用;
          3. 需要考慮在嵌入式等 ARM 平臺下,此規(guī)則是否同樣適用,是否還有其他應(yīng)用場景限制等?歡迎私信/加我好友一起討論~



          推薦閱讀:
          專輯|Linux文章匯總
          專輯|程序人生
          專輯|C語言
          我的知識小密圈

          瀏覽 39
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  情侣操逼视频 | 99国产婷婷踪合在线免费视频 | 久草2024| 婷婷在线成人视频精品 | 婷婷丁香花激情 |