青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

為什么處理排序的數(shù)組要比非排序的快?

參考Why is processing a sorted array faster than an unsorted array?

問題

看以下代碼:

#include <algorithm>
#include <ctime>
#include <iostream>

int main()
{
    // generate data
    const unsigned arraySize = 32768;
    int data[arraySize];

    for (unsigned c = 0; c < arraySize; ++c)
        data[c] = std::rand() % 256;


    // !!! with this, the next loop runs faster
    std::sort(data, data + arraySize);


    // test
    clock_t start = clock();
    long long sum = 0;

    for (unsigned i = 0; i < 100000; ++i)
    {
        // primary loop
        for (unsigned c = 0; c < arraySize; ++c)
        {
            if (data[c] >= 128)
                sum += data[c];
        }
    }

    double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;

    std::cout << elapsedTime << std::endl;
    std::cout << "sum = " << sum << std::endl;
}

問題就在于,去掉std::sort那一行,以上代碼將運(yùn)行更長的時(shí)間。在我的機(jī)器上未去掉std::sort耗時(shí)8.99s,去掉后耗時(shí)24.78s。編譯器使用的是gcc4.4.3。事實(shí)上,以上代碼跟編譯器沒有關(guān)系,甚至跟語言沒有關(guān)系。那這是為什么呢?

這跟處理這個(gè)數(shù)組的邏輯有非常大的關(guān)系。如以上代碼所示,這個(gè)循環(huán)里有個(gè)條件判斷。條件判斷被編譯成二進(jìn)制代碼后,就是一個(gè)跳轉(zhuǎn)指令,類似:

具體為什么會不同,這涉及到計(jì)算機(jī)CPU執(zhí)行指令時(shí)的行為。

CPU的流水線指令執(zhí)行

想象現(xiàn)在有一堆指令等待CPU去執(zhí)行,那么CPU是如何執(zhí)行的呢?具體的細(xì)節(jié)可以找一本計(jì)算機(jī)組成原理的書來看。CPU執(zhí)行一堆指令時(shí),并不是單純地一條一條取出來執(zhí)行,而是按照一種流水線的方式,在CPU真正執(zhí)行一條指令前,這條指令就像工廠里流水線生產(chǎn)的產(chǎn)品一樣,已經(jīng)被經(jīng)過一些處理。簡單來說,一條指令可能經(jīng)過這些過程:取指(Fetch)、解碼(Decode)、執(zhí)行(Execute)、放回(Write-back)。

假設(shè)現(xiàn)在有指令序列ABCDEFG。當(dāng)CPU正在執(zhí)行(execute)指令A(yù)時(shí),CPU的其他處理單元(CPU是由若干部件構(gòu)成的)其實(shí)已經(jīng)預(yù)先處理到了指令A(yù)后面的指令,例如B可能已經(jīng)被解碼,C已經(jīng)被取指。這就是流水線執(zhí)行,這可以保證CPU高效地執(zhí)行指令。

Branch Prediction

如上所說,CPU在執(zhí)行一堆順序執(zhí)行的指令時(shí),因?yàn)閷τ趫?zhí)行指令的部件來說,其基本不需要等待,因?yàn)橹T如取指、解碼這些過程早就被做了。但是,當(dāng)CPU面臨非順序執(zhí)行的指令序列時(shí),例如之前提到的跳轉(zhuǎn)指令,情況會怎樣呢?

取指、解碼這些CPU單元并不知道程序流程會跳轉(zhuǎn),只有當(dāng)CPU執(zhí)行到跳轉(zhuǎn)指令本身時(shí),才知道該不該跳轉(zhuǎn)。所以,取指解碼這些單元就會繼續(xù)取跳轉(zhuǎn)指令之后的指令。當(dāng)CPU執(zhí)行到跳轉(zhuǎn)指令時(shí),如果真的發(fā)生了跳轉(zhuǎn),那么之前的預(yù)處理(取指、解碼)就白做了。這個(gè)時(shí)候,CPU得從跳轉(zhuǎn)目標(biāo)處臨時(shí)取指、解碼,然后才開始執(zhí)行,這意味著:CPU停了若干個(gè)時(shí)鐘周期!

這其實(shí)是個(gè)問題,如果CPU的設(shè)計(jì)放任這個(gè)問題,那么其速度就很難提升起來。為此,人們發(fā)明了一種技術(shù),稱為branch prediction,也就是分支預(yù)測。分支預(yù)測的作用,就是預(yù)測某個(gè)跳轉(zhuǎn)指令是否會跳轉(zhuǎn)。而CPU就根據(jù)自己的預(yù)測到目標(biāo)地址取指令。這樣,即可從一定程度提高運(yùn)行速度。當(dāng)然,分支預(yù)測在實(shí)現(xiàn)上有很多方法。

簡單的預(yù)測可以直接使用之前的實(shí)際執(zhí)行結(jié)果。例如某個(gè)跳轉(zhuǎn)指令某一次產(chǎn)生了跳轉(zhuǎn),那么下一次執(zhí)行該指令時(shí),CPU就直接從跳轉(zhuǎn)目標(biāo)地址處取指,而不是該跳轉(zhuǎn)指令的下一條指令。

答案

了解了以上信息后,文章開頭提出的問題就可以解釋了。這個(gè)代碼中有一個(gè)循環(huán),這個(gè)循環(huán)里有一個(gè)條件判斷。每一次CPU執(zhí)行這個(gè)條件判斷時(shí),CPU都可能跳轉(zhuǎn)到循環(huán)開始處的指令,即不執(zhí)行if后的指令。使用分支預(yù)測技術(shù),當(dāng)處理已經(jīng)排序的數(shù)組時(shí),在若干次data[c]>=128都不成立時(shí)(或第一次不成立時(shí),取決于分支預(yù)測的實(shí)現(xiàn)),CPU預(yù)測這個(gè)分支是始終會跳轉(zhuǎn)到循環(huán)開始的指令時(shí),這個(gè)時(shí)候CPU將保持有效的執(zhí)行,不需要重新等待到新的地址取指;同樣,當(dāng)data[c]>=128條件成立若干次后,CPU也可以預(yù)測這個(gè)分支是不必跳轉(zhuǎn)的,那么這個(gè)時(shí)候CPU也可以保持高效執(zhí)行。

相反,如果是無序的數(shù)組,CPU的分支預(yù)測在很大程度上都無法預(yù)測成功,基本就是50%的預(yù)測成功概率,這將消耗大量的時(shí)間,因?yàn)镃PU很多時(shí)間都會等待取指單元重新取指。

本文完。最后感嘆下stackoverflow上這個(gè)帖子里那個(gè)老外回答問題的專業(yè)性,我要是樓主早就感動得涕淚橫飛了。感謝每一個(gè)傳播知識的人。

參考資料

  1. http://blog.sina.com.cn/s/blog_6c673e570100zfmo.html
  2. http://www.cnblogs.com/dongliqian/archive/2012/04/05/2433847.html
  3. http://en.wikipedia.org/wiki/Branch_predictor

posted on 2012-08-30 17:43 Kevin Lynx 閱讀(3114) 評論(3)  編輯 收藏 引用 所屬分類: c/c++ 、other

評論

# re: 為什么處理排序的數(shù)組要比非排序的快?[未登錄] 2012-08-30 18:12 sand

so professional!, nice job!  回復(fù)  更多評論   

# re: 為什么處理排序的數(shù)組要比非排序的快? 2012-08-30 19:30 畢達(dá)哥拉斯半圓

答案是很簡單的,但是回答的太專業(yè)了,而且還配了張圖片,這人多有空??!閑的  回復(fù)  更多評論   

# re: 為什么處理排序的數(shù)組要比非排序的快? 2012-09-01 09:50 liyou

看不到圖  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            韩日视频一区| 国模叶桐国产精品一区| 欧美日韩精品一区二区| 一区二区视频免费在线观看| 午夜一级久久| 一区二区三区 在线观看视| 美国成人毛片| 亚洲第一在线| 免费在线观看精品| 久久久欧美精品| 国产欧美精品日韩精品| 亚欧成人精品| 欧美一区二区三区四区高清| 国产亚洲精品久| 久久精品国产999大香线蕉| 午夜在线观看欧美| 国产午夜精品麻豆| 榴莲视频成人在线观看| 久久视频在线免费观看| 亚洲人午夜精品免费| 亚洲国产精品电影| 欧美va亚洲va日韩∨a综合色| 在线看片成人| 亚洲国产精品成人久久综合一区| 欧美黄在线观看| 亚洲午夜性刺激影院| 亚洲影院污污.| 狠狠久久婷婷| 亚洲高清自拍| 欧美日韩性生活视频| 欧美一区二视频在线免费观看| 午夜精彩国产免费不卡不顿大片| 国产曰批免费观看久久久| 久久亚洲风情| 欧美精品久久天天躁| 亚洲欧美精品伊人久久| 久久精品首页| 亚洲精品一二区| 亚洲视频福利| 亚洲一区二区在线免费观看视频 | 一区视频在线播放| 蜜乳av另类精品一区二区| 欧美二区在线播放| 亚洲欧美日韩国产综合在线| 欧美在线欧美在线| 亚洲区欧美区| 亚洲永久字幕| 亚洲黄色成人久久久| 亚洲视频网站在线观看| 亚洲国产精品尤物yw在线观看| 日韩一级免费观看| 在线精品视频在线观看高清 | 久久久蜜桃一区二区人| 亚洲视频1区| 久久久免费av| 欧美一级二级三级蜜桃| 欧美精品一二三| 久久嫩草精品久久久久| 欧美日韩在线播放| 欧美成人一区二区| 国产日韩av高清| 99国产精品久久久| 91久久久一线二线三线品牌| 校园春色国产精品| 亚洲伊人久久综合| 欧美日本免费一区二区三区| 久久久久久九九九九| 国产精品久久久久999| 亚洲国产精品一区二区久| 韩国av一区二区三区四区| 亚洲一区欧美激情| 在线午夜精品自拍| 欧美精品18+| 欧美国产精品专区| 一区二区在线视频| 欧美一区二区三区精品电影| 亚洲一区二区三区视频| 欧美精品日韩一区| 亚洲福利久久| 在线观看一区视频| 久久精品一区| 久久一区二区三区四区五区| 国产一区二区三区网站| 午夜精品福利在线观看| 亚洲欧美国产精品桃花| 欧美日韩在线观看视频| 亚洲免费成人av| 999在线观看精品免费不卡网站| 老司机成人网| 欧美成人按摩| 亚洲国产精品成人综合| 久久亚洲春色中文字幕| 蜜臀av一级做a爰片久久| 悠悠资源网久久精品| 久久精品在线| 久久综合色8888| 精品成人在线观看| 久热精品视频在线观看| 亚洲成人直播| 一本色道88久久加勒比精品| 欧美日韩1区| 一本色道久久综合精品竹菊| 亚洲视频一区二区在线观看| 一本色道久久综合亚洲91| 日韩午夜电影在线观看| 一区二区三区国产| 欧美日韩在线免费观看| 一区二区日韩精品| 欧美中文在线视频| 黄色工厂这里只有精品| 麻豆精品视频| 亚洲精品孕妇| 欧美亚洲在线播放| 国产一区二区精品久久| 噜噜噜在线观看免费视频日韩| 亚洲国产99精品国自产| 亚洲婷婷综合久久一本伊一区| 国产精品美女久久久久aⅴ国产馆| 亚洲一区综合| 欧美.www| 亚洲伊人第一页| 狠狠色丁香婷综合久久| 欧美粗暴jizz性欧美20| 在线性视频日韩欧美| 久久久久国色av免费看影院 | 性欧美xxxx视频在线观看| 国模套图日韩精品一区二区| 欧美sm视频| 亚洲淫性视频| 欧美岛国激情| 欧美亚洲日本国产| 亚洲电影第三页| 国产精品qvod| 久久综合狠狠综合久久激情| 日韩香蕉视频| 久久资源av| 新狼窝色av性久久久久久| 在线免费观看日韩欧美| 欧美色区777第一页| 久久婷婷蜜乳一本欲蜜臀| 亚洲一二三四久久| 亚洲国产精品久久| 久久久蜜桃一区二区人| 亚洲综合不卡| 99视频精品免费观看| 伊人色综合久久天天| 国产精品日韩精品欧美精品| 欧美成人日韩| 久久免费精品视频| 亚洲欧美日韩一区二区在线| 亚洲全黄一级网站| 欧美电影在线观看完整版| 久久精品国产一区二区三区| 中文国产成人精品| 亚洲另类黄色| 亚洲国产精品999| 激情五月婷婷综合| 国产午夜精品全部视频在线播放| 欧美深夜影院| 欧美激情第3页| 免费欧美视频| 久久视频这里只有精品| 欧美综合77777色婷婷| 亚洲曰本av电影| 一本久久青青| 99re亚洲国产精品| 亚洲国产毛片完整版 | 亚洲激情网站| 亚洲第一视频| 亚洲福利视频一区| 亚洲福利视频网| 国产在线观看一区| 欧美风情在线观看| 精品51国产黑色丝袜高跟鞋| 国产区精品视频| 国产欧美一区二区色老头 | 羞羞答答国产精品www一本| 亚洲男人影院| 午夜精品短视频| 性色av一区二区三区| 亚洲欧美综合网| 午夜亚洲一区| 久久国产精品久久w女人spa| 久久精品国产精品 | 亚洲精品中文字幕在线观看| 亚洲人成网在线播放| 日韩一级二级三级| 一区二区三区产品免费精品久久75 | 国产日韩欧美精品在线| 黑人一区二区| 亚洲精品免费一区二区三区| 一本色道久久88综合亚洲精品ⅰ| 一区二区三区高清在线 | 欧美在线free| 久久频这里精品99香蕉| 欧美高清你懂得| 国产精品高潮久久| 国产女主播视频一区二区| 在线观看日韩www视频免费| 亚洲伦伦在线|