<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>

          多線程一定能優(yōu)化程序性能嗎?

          共 1773字,需瀏覽 4分鐘

           ·

          2022-07-26 18:07

          問(wèn):如果一個(gè)和尚挑水喝,兩個(gè)和尚抬水喝,三個(gè)和尚沒(méi)水喝,那么眾人拾柴一定火焰高嗎?

          多線程一定能提高程序性能嗎?在計(jì)算機(jī)科學(xué)中,這個(gè)問(wèn)題的標(biāo)準(zhǔn)答案是“it depends”,看情況。

          計(jì)算機(jī)中的一切設(shè)計(jì)都是為了更加高效的利用硬件資源,包括:CPU、內(nèi)存、IO等,我們一樣一樣來(lái)了解一下。


          多線程與CPU

          多線程與CPU是程序員了解的最多的,我們知道多線的目的之一在于充分利用多核,但這里有個(gè)前提就是你要處理的任務(wù)真的能拆分成獨(dú)立的子任務(wù)。
          舉個(gè)例子,如果你想對(duì)一個(gè)數(shù)組所有元素的和,那么這個(gè)任務(wù)就可以拆分成為兩個(gè)獨(dú)立的子任務(wù):任務(wù)A計(jì)算前一半數(shù)組元素的和,任務(wù)B計(jì)算后一半數(shù)組元素的和,然后任務(wù)A和任務(wù)B分別交給兩個(gè)線程來(lái)執(zhí)行。
          如果是在多核系統(tǒng)下這類多線程并行處理將顯著提高程序性能,但這種使用多線程充分利用多核帶來(lái)的性能提升是有上限的。
          道理很簡(jiǎn)單,這就好比蓋房子,蓋房子算是個(gè)不大不小的工程,讓一個(gè)人來(lái)完成也不是不可以,但再來(lái)六七個(gè)人顯然能加快工程速度,但是再來(lái)成百上千工人來(lái)蓋一棟房子可能速度反而會(huì)變慢,畢竟資源是有限的(可用的工具等),人一多需要用在協(xié)調(diào)上的時(shí)間就會(huì)變多,多線程也是同樣的道理,當(dāng)線程數(shù)量超過(guò)某個(gè)臨界點(diǎn)時(shí)操作系統(tǒng)就開始忙不過(guò)來(lái)了(頻繁調(diào)度切換),我稱之為三個(gè)和尚沒(méi)水喝現(xiàn)象。
          但如果系統(tǒng)是單核的,那么這種任務(wù)拆分則不會(huì)有什么效果,因?yàn)椴还苣銊?chuàng)建多少線程真正工作的CPU只有一個(gè)。
          當(dāng)然也有可能我們根本就不能對(duì)任務(wù)進(jìn)行拆分,像計(jì)算斐波那契數(shù)列這類問(wèn)題,如果你不能計(jì)算出f(n-1)與f(n-2)的解,那么你根本就沒(méi)有辦法計(jì)算出當(dāng)前問(wèn)題f(n)的解,被拆分的兩個(gè)任務(wù)A和B有前后依賴關(guān)系,這時(shí)多線程就沒(méi)有用武之地了。
          還有一種可能,就是你的問(wèn)題規(guī)模非常小,如果這個(gè)數(shù)組是有幾百幾千個(gè)元素,那么這時(shí)你使用多線程意義不大,這時(shí)使用多線程帶來(lái)的收益不足以抵消掉多線程帶來(lái)的性能開銷。

          多線程與IO
          多線程一定能提升程序的IO性能嗎?答案顯然不是的。
          最簡(jiǎn)單的場(chǎng)景是這樣的,你的程序需要從一個(gè)速度極慢的網(wǎng)絡(luò)鏈接上讀寫數(shù)據(jù),在這種情況下一個(gè)線程很可能就足以應(yīng)付的過(guò)來(lái),創(chuàng)建多個(gè)線程反而可能對(duì)程序性能有損。
          相同的情況也會(huì)出現(xiàn)在磁盤上,一個(gè)線程可能就已經(jīng)將磁盤打滿,這時(shí)創(chuàng)建多個(gè)線程去讀寫文件顯然不能加快程序的處理速度。
          而在服務(wù)器端,程序員也使用多線程加快程序處理速度,在這里,一個(gè)典型的問(wèn)題是阻塞式網(wǎng)絡(luò)IO會(huì)導(dǎo)致調(diào)用線程被掛起而暫停運(yùn)行,此時(shí)最簡(jiǎn)單的方法就是創(chuàng)建多個(gè)線程,每個(gè)線程處理一個(gè)請(qǐng)求,但隨著請(qǐng)求的增多創(chuàng)建的線程也會(huì)越來(lái)越多,此時(shí)三個(gè)和尚沒(méi)水喝現(xiàn)象開始出現(xiàn),IO多路復(fù)用技術(shù)可以很好的解決這一問(wèn)題。
          當(dāng)然,如果你的場(chǎng)景是IO會(huì)阻塞住處理線程,那么此時(shí)創(chuàng)建兩個(gè)線程,一個(gè)負(fù)責(zé)處理數(shù)據(jù),一個(gè)負(fù)責(zé)等待IO,那么這顯然會(huì)提高程序性能。

          多線程與內(nèi)存
          內(nèi)存其實(shí)和磁盤一樣,也是有讀寫帶寬上限的,但我們的程序一般都不會(huì)達(dá)到內(nèi)存讀寫帶寬上限,這并不是瓶頸。
          瓶頸在于多線程共享的內(nèi)存資源(數(shù)據(jù))以及多核系統(tǒng)的cache一致性問(wèn)題。
          一般來(lái)說(shuō),對(duì)于多線程共享資源通常需要互斥訪問(wèn),然而為加快內(nèi)存讀寫速度,現(xiàn)代處理器中都有cache系統(tǒng)(L1、L2、L3),每個(gè)核心都有自己的cache,這些cache會(huì)緩存內(nèi)存數(shù)據(jù),也就是說(shuō)一份數(shù)據(jù)可能會(huì)同時(shí)存在于內(nèi)存以及各個(gè)核心的cache中,這就會(huì)帶來(lái)經(jīng)典的數(shù)據(jù)一致性問(wèn)題:某個(gè)核心修改了cache中的數(shù)據(jù)后需要將其同步給其它核心,這就要求cache系統(tǒng)中必須有能確保一致性的協(xié)議,否則程序可能會(huì)讀取到錯(cuò)誤的(過(guò)期的)數(shù)據(jù)。
          然而這種同步是有性能損耗的,多個(gè)線程頻繁操作同一個(gè)變量可能導(dǎo)致處理器cache系統(tǒng)需要頻繁在各個(gè)核心之間進(jìn)行同步,極端情況下多線程程序性能甚至比單線程要差。
          因此多線程之間能不共享數(shù)據(jù)就不要共享,如果一定要共享,那么就盡量將其控制在最小范圍,讀寫頻次控制到最少。

          w3cschool編程獅


          專門學(xué)習(xí)編程的學(xué)習(xí)網(wǎng)站


          同時(shí),也歡迎各位朋友們添加我們學(xué)習(xí)顧問(wèn)的微信 ↓,可以領(lǐng)取10G免費(fèi)學(xué)習(xí)資料包,也可以申請(qǐng)加入學(xué)習(xí)交流群(包括前端、Python、Java、Php、C、小程序、數(shù)據(jù)庫(kù)等)。


          編程獅學(xué)習(xí)顧問(wèn)-七七

          添加時(shí)請(qǐng)備注(咨詢

          如果您覺得本篇文章還不錯(cuò)
          點(diǎn)贊、在看、分享三連支持一下
          瀏覽 27
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  青青草视频在线网站 | 爱爱三级毛片 | 九哥操逼逼视频一区二区 | 乱伦激情网 | 日韩精品一区二区三区无码AV |