女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

多線程一定能提高程序性能嗎

lhl545545 ? 來源:良許Linux ? 作者:良許Linux ? 2022-09-26 10:31 ? 次閱讀

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

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

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

多線程與CPU

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

多線程與IO

多線程一定能提升程序的IO性能嗎?答案顯然不是的。 最簡(jiǎn)單的場(chǎng)景是這樣的,你的程序需要從一個(gè)速度極慢的網(wǎng)絡(luò)鏈接上讀寫數(shù)據(jù),在這種情況下,一個(gè)線程很可能就足以應(yīng)付得過來,創(chuàng)建多個(gè)線程反而可能對(duì)程序性能有損。 相同的情況也會(huì)出現(xiàn)在磁盤上,一個(gè)線程可能就已經(jīng)將磁盤打滿,這時(shí)創(chuàng)建多個(gè)線程去讀寫文件顯然不能加快程序的處理速度。 而在服務(wù)器端,程序員也使用多線程加快程序處理速度,在這里,一個(gè)典型的問題是阻塞式網(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ì)越來越多,此時(shí)三個(gè)和尚沒水喝現(xiàn)象開始出現(xiàn),IO多路復(fù)用技術(shù)可以很好地解決這一問題。 當(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一致性問題。 一般來說,對(duì)于多線程共享資源通常需要互斥訪問,然而為加快內(nèi)存讀寫速度,現(xiàn)代處理器中都有cache系統(tǒng)(L1、L2、L3),每個(gè)核心都有自己的cache,這些cache會(huì)緩存內(nèi)存數(shù)據(jù),也就是說一份數(shù)據(jù)可能會(huì)同時(shí)存在于內(nèi)存以及各個(gè)核心的cache中,這就會(huì)帶來經(jīng)典的數(shù)據(jù)一致性問題:某個(gè)核心修改了cache中的數(shù)據(jù)后需要將其同步給其他核心,這就要求cache系統(tǒng)中必須有能確保一致性的協(xié)議,否則程序可能會(huì)讀取到錯(cuò)誤的(過期的)數(shù)據(jù)。 250bb0dc-3bae-11ed-9e49-dac502259ad0.png 然而這種同步是有性能損耗的,多個(gè)線程頻繁操作同一個(gè)變量可能導(dǎo)致處理器cache系統(tǒng)需要頻繁在各個(gè)核心之間進(jìn)行同步,極端情況下多線程程序性能甚至比單線程要差。 因此多線程之間能不共享數(shù)據(jù)就不要共享,如果一定要共享,那么就盡量將其控制在最小范圍,讀寫頻次控制到最少?! ?/p>

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11028

    瀏覽量

    215812
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7625

    瀏覽量

    90069
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3105

    瀏覽量

    74951
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    279

    瀏覽量

    20284

原文標(biāo)題:多線程一定能優(yōu)化程序性能嗎?

文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Java多線程的用法

    本文將介紹下Java多線程的用法。 基礎(chǔ)介紹 什么是多線程 指的是在個(gè)進(jìn)程中同時(shí)運(yùn)行多個(gè)線程,每個(gè)
    的頭像 發(fā)表于 09-30 17:07 ?1138次閱讀

    多線程的過程程序

    1、多線程了解線程之前我們必須要先了解(程序—>進(jìn)程—>線程)的過程程序:是組計(jì)算機(jī)能識(shí)別和執(zhí)
    發(fā)表于 08-24 08:28

    改進(jìn)的多線程應(yīng)用程序調(diào)試(Altium Designer版本10)

    Altium Designer 版本10的發(fā)布為POSIX多線程庫(kù)的支持帶來了系列改進(jìn) 允許多線程應(yīng)用程序種直觀流暢的方式調(diào)試。
    發(fā)表于 05-15 12:49 ?1482次閱讀
    改進(jìn)的<b class='flag-5'>多線程</b>應(yīng)用<b class='flag-5'>程序</b>調(diào)試(Altium Designer版本10)

    多線程與聊天室程序的創(chuàng)建

    多線程程序的編寫,多線程應(yīng)用中容易出現(xiàn)的問題?;コ鈱?duì)象的講解,如何采用互斥對(duì)象來實(shí)現(xiàn)多線程的同步。如何利用命名互斥對(duì)象保證應(yīng)用程序只有
    發(fā)表于 05-16 15:22 ?0次下載

    7個(gè)好習(xí)慣快速提升Python程序性能

    使用局部變量替換模塊名字空間中的變量,例如 ls = os.linesep。方面可以提高程序性能,局部變量查找速度更快;另方面可用簡(jiǎn)短標(biāo)識(shí)符替代冗長(zhǎng)的模塊變量,提高可讀性。
    發(fā)表于 07-07 10:05 ?1090次閱讀
    7個(gè)好習(xí)慣快速提升Python<b class='flag-5'>程序性能</b>

    C#多線程技術(shù)

    程序中,在個(gè)線程必須等待的時(shí)候,CPU可以運(yùn)行其他線程而不是等待,這就大大提高程序的效率。
    發(fā)表于 04-23 11:32 ?15次下載

    利用矢量硬件如何提高應(yīng)用程序性能

    本次會(huì)議演示了識(shí)別和修改代碼以利用矢量硬件的過程如何提高應(yīng)用程序性能。
    的頭像 發(fā)表于 05-31 11:46 ?1474次閱讀

    Java教程之零點(diǎn)起飛學(xué)Java的線程資料說明

    多線程編程是提高應(yīng)用程序性能的重要手段之。Java平臺(tái)從開始就被設(shè)計(jì)成為多線程環(huán)境,從語言級(jí)上支持多線
    發(fā)表于 02-20 10:41 ?3次下載
    Java教程之零點(diǎn)起飛學(xué)Java的<b class='flag-5'>線程</b>資料說明

    如何通過多線程并發(fā)設(shè)計(jì)來提高應(yīng)用程序性能

    這里我們簡(jiǎn)單總結(jié)了下,在現(xiàn)代多處理器或多內(nèi)核環(huán)境下,如何通過多線程并發(fā)設(shè)計(jì)來提高我們應(yīng)用程序性能和響應(yīng)性。
    的頭像 發(fā)表于 09-28 02:13 ?5484次閱讀

    PGO到底是什么?PGO如何提高應(yīng)用程序性能呢?

    PGO到底是什么?PGO如何提高應(yīng)用程序性能呢? PGO,全稱為Profile Guided Optimization,譯為“基于特征優(yōu)化”的技術(shù),是種通過利用應(yīng)用程序的運(yùn)行特征數(shù)據(jù)
    的頭像 發(fā)表于 10-26 17:37 ?2361次閱讀

    多線程如何保證數(shù)據(jù)的同步

    多線程編程是種并發(fā)編程的方法,意味著程序中同時(shí)運(yùn)行多個(gè)線程,每個(gè)線程可獨(dú)立執(zhí)行不同的任務(wù),共享同
    的頭像 發(fā)表于 11-17 14:22 ?1552次閱讀

    mfc多線程編程實(shí)例

    (圖形用戶界面)應(yīng)用程序的開發(fā)。在這篇文章中,我們將重點(diǎn)介紹MFC中的多線程編程。 多線程編程在軟件開發(fā)中非常重要,它可以實(shí)現(xiàn)程序的并發(fā)執(zhí)行,提高程
    的頭像 發(fā)表于 12-01 14:29 ?1790次閱讀

    你還是分不清多進(jìn)程和多線程嗎?文搞懂!

    你還是分不清多進(jìn)程和多線程嗎?文搞懂! 多進(jìn)程和多線程是并發(fā)編程中常見的兩個(gè)概念,它們都可以用于提高程序性能和效率。但是它們的實(shí)現(xiàn)方式和
    的頭像 發(fā)表于 12-19 16:07 ?830次閱讀

    java實(shí)現(xiàn)多線程的幾種方式

    Java實(shí)現(xiàn)多線程的幾種方式 多線程是指程序中包含了兩個(gè)或以上的線程,每個(gè)線程都可以并行執(zhí)行不同的任務(wù)或操作。Java中的
    的頭像 發(fā)表于 03-14 16:55 ?1031次閱讀

    socket 多線程編程實(shí)現(xiàn)方法

    是指在同個(gè)進(jìn)程中運(yùn)行多個(gè)線程,每個(gè)線程可以獨(dú)立執(zhí)行任務(wù)。線程共享進(jìn)程的資源,如內(nèi)存空間和文件句柄,但每個(gè)線程有自己的
    的頭像 發(fā)表于 11-12 14:16 ?859次閱讀