成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Code Inside:為什么處理已排序數組比處理未排序數組更快?

開發(fā) 后端 開發(fā)工具
現代處理器都支持指令并行處理和超流水線作業(yè)。因此,當處理器遇到程序分支時,都會去猜測應該走哪一條分支。如果猜對了,程序接著流暢運行。如果猜錯了,則處理器需要做一些額外的工作,再次回到那條正確的分支。

很久以前在stackoverflow上看到下面這段代碼,今天忍不住把它摘錄過來。

  1. #include <algorithm>  
  2. #include <ctime>  
  3. #include <iostream>  
  4.    
  5. int main()  
  6. {  
  7.     // Generate data  
  8.     const unsigned arraySize = 32768;  
  9.     int data[arraySize];  
  10.    
  11.     for (unsigned c = 0; c < arraySize; ++c)  
  12.         data[c] = std::rand() % 256;  
  13.    
  14.     // !!! With this, the next loop runs faster  
  15.     std::sort(data, data + arraySize);  
  16.    
  17.     // Test  
  18.     clock_t start = clock();  
  19.     long long sum = 0;  
  20.    
  21.     for (unsigned i = 0; i < 100000; ++i)  
  22.     {  
  23.         // Primary loop  
  24.         for (unsigned c = 0; c < arraySize; ++c)  
  25.         {  
  26.             if (data[c] >= 128)  
  27.                 sum += data[c];  
  28.         }  
  29.     }  
  30.    
  31.     double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;  
  32.    
  33.     std::cout << elapsedTime << std::endl;  
  34.     std::cout << "sum = " << sum << std::endl;  

上面的程序在保留std::sort(data, data + arraySize);語句時,程序運行時間是1.93 

但去掉排序語句后,程序運行時間是11.54

問題:為什么會出現這種情況?

解答分支預測

[[119029]]

程序分支

考慮以下if語句塊。對于處理器來說,就是一個分支指令,如下:

處理器每次遇到一條分支時,它都不知道該走哪一條道。這時候該怎么辦?程序停下來,等待前面的指令執(zhí)行完,得到確切的結果后,再接著走某一條分支。

現代處理器都支持指令并行處理和超流水線作業(yè)。因此,當處理器遇到程序分支時,都會去猜測應該走哪一條分支。

如果猜對了,程序接著流暢運行。如果猜錯了,則處理器需要做一些額外的工作,再次回到那條正確的分支。

因此,如果處理器每次都猜錯,那程序的運行時間就會邊長。

這就是上面的代碼為什么運行時間會相差那么大的原因。

對于分支語句:

  1. if (data[c] >= 128)  
  2.     sum += data[c]; 

在保留std::sort(data, data + arraySize);的情況下。數組data中的內容是這樣的:

  1. T = branch taken  
  2. N = branch not taken  
  3.    
  4. data[] = 01234, ... 126127128129130, ... 250251252, ...  
  5. branch = N  N  N  N  N  ...   N    N    T    T    T  ...   T    T    T  ...  
  6.    
  7.        = NNNNNNNNNNNN ... NNNNNNNTTTTTTTTT ... TTTTTTTTTT  (easy to predict) 

在未排序的情況下,數組data中的內容是這樣的:

  1. data[] = 22618512515819814421779202118,  14150177182133, ...  
  2. branch =   T,   T,   N,   T,   T,   T,   T,  N,   T,   N,   N,   T,   T,   T,   N  ...  
  3.    
  4.        = TTNTTTTNTNNTTTN ...   (completely random - hard to predict) 

也就是說,在已經排序的情況下,處理器便能更好的預測分支了。因此,程序也運行的更快。

關于分支預測

閱讀linux源代碼時,你會發(fā)現if(likely( )){}或是if(unlikely( ))這樣的語句。對于條件選擇語句,gcc內建了一條指令用于優(yōu)化,在一個條件經常出現,或者該條件很少出現的時候,編譯器可以根據這條指令對條件分支選擇進行優(yōu)化。而Linux內核把這條指令封裝成了宏likely()和unlikely()。

因此,在編寫程序時,如果一個分支條件只有在很少數的情況下才出現時,我們使用unlikely( )和likely( )能夠加快程序的運行,這也是一種優(yōu)化程序的手段。

比如這樣:

  1. if ( unlikely(statement) ) { //這里便是告訴編譯器,這個條件只在少數情況下發(fā)生  
  2.  
  3. dosomething();  
  4.  

原文鏈接:http://www.cricode.com/3347.html

責任編輯:林師授 來源: 快課網
相關推薦

2020-10-15 12:30:37

Python編程語言

2021-10-18 11:29:48

奇偶排序數組數據結構算法

2021-11-08 23:09:07

Go排序數據

2021-01-13 10:51:08

PromissetTimeout(函數

2009-11-16 17:35:38

PHP數組排序

2009-11-16 16:17:45

PHP數組排序

2021-11-02 14:54:41

排序數組元素

2021-12-13 11:31:36

排序數組數據結構算法

2023-09-14 15:48:53

排序測試

2017-04-06 14:10:08

JavaScript數組排序

2009-11-30 18:59:52

PHP數組排序

2009-08-13 10:35:05

Scala數組排序

2021-11-17 08:43:17

LeetCode有序數組算法

2021-07-05 06:39:59

經典算法無序數組

2020-12-07 15:16:04

排序算法

2021-09-07 11:01:41

二叉搜索樹序數組

2022-04-28 12:00:34

Go泛型版排序

2009-11-25 09:56:06

PHP數組處理函數

2009-10-15 09:36:26

VB System.A

2021-07-06 07:01:35

旋轉數組數字
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品一区二区三区在线观看 | 99热这里都是精品 | 伊人久久综合 | 日韩在线不卡视频 | 久久91精品久久久久久9鸭 | 亚洲精品久久久久久久久久久久久 | 九九九视频 | 国产精品高潮呻吟久久 | 国产91丝袜在线播放 | 欧美一级片在线看 | 国产一级片免费视频 | 欧美极品视频 | 亚洲资源站 | 成人毛片一区二区三区 | 五月天国产视频 | 亚洲午夜精品久久久久久app | 久久成人免费视频 | 男人的天堂久久 | 日韩精品一区二区三区 | 国产乱人伦 | 精品少妇v888av| 成人在线视频免费观看 | a级毛片国产 | 日韩在线成人 | 亚洲国产精品99久久久久久久久 | 一级片在线观看视频 | 亚洲高清在线免费观看 | 精品免费国产一区二区三区四区介绍 | av片在线观看 | 四虎永久免费在线 | 国产视频一视频二 | av三级在线观看 | 亚洲成人一二区 | 九色av| 香蕉视频91 | 精品国产91乱码一区二区三区 | 精品一区二区三区四区在线 | 在线一级片 | 精品国产三级 | 久久久国产一区 | 天堂久久av |