精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

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

多線程一定能提高程序性能嗎?在計算機科學中,這個問題的標準答案是“it depends”,看情況。

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

多線程與CPU

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

多線程與IO

多線程一定能提升程序的IO性能嗎?答案顯然不是的。 最簡單的場景是這樣的,你的程序需要從一個速度極慢的網絡鏈接上讀寫數據,在這種情況下,一個線程很可能就足以應付得過來,創建多個線程反而可能對程序性能有損。 相同的情況也會出現在磁盤上,一個線程可能就已經將磁盤打滿,這時創建多個線程去讀寫文件顯然不能加快程序的處理速度。 而在服務器端,程序員也使用多線程加快程序處理速度,在這里,一個典型的問題是阻塞式網絡IO會導致調用線程被掛起而暫停運行,此時最簡單的方法就是創建多個線程,每個線程處理一個請求,但隨著請求的增多,創建的線程也會越來越多,此時三個和尚沒水喝現象開始出現,IO多路復用技術可以很好地解決這一問題。 當然,如果你的場景是IO會阻塞住處理線程,那么此時創建兩個線程,一個負責處理數據,一個負責等待IO,那么這顯然會提高程序性能。

多線程與內存

內存其實和磁盤一樣,也是有讀寫帶寬上限的,但我們的程序一般都不會達到內存讀寫帶寬上限,這并不是瓶頸。 瓶頸在于多線程共享的內存資源(數據)以及多核系統的cache一致性問題。 一般來說,對于多線程共享資源通常需要互斥訪問,然而為加快內存讀寫速度,現代處理器中都有cache系統(L1、L2、L3),每個核心都有自己的cache,這些cache會緩存內存數據,也就是說一份數據可能會同時存在于內存以及各個核心的cache中,這就會帶來經典的數據一致性問題:某個核心修改了cache中的數據后需要將其同步給其他核心,這就要求cache系統中必須有能確保一致性的協議,否則程序可能會讀取到錯誤的(過期的)數據。 250bb0dc-3bae-11ed-9e49-dac502259ad0.png 然而這種同步是有性能損耗的,多個線程頻繁操作同一個變量可能導致處理器cache系統需要頻繁在各個核心之間進行同步,極端情況下多線程程序性能甚至比單線程要差。 因此多線程之間能不共享數據就不要共享,如果一定要共享,那么就盡量將其控制在最小范圍,讀寫頻次控制到最少。  

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10829

    瀏覽量

    211183
  • 計算機
    +關注

    關注

    19

    文章

    7430

    瀏覽量

    87733
  • 內存
    +關注

    關注

    8

    文章

    3004

    瀏覽量

    73900
  • 多線程
    +關注

    關注

    0

    文章

    277

    瀏覽量

    19923

原文標題:多線程一定能優化程序性能嗎?

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Java多線程的用法

    本文將介紹下Java多線程的用法。 基礎介紹 什么是多線程 指的是在個進程中同時運行多個線程,每個
    的頭像 發表于 09-30 17:07 ?930次閱讀

    多線程的過程程序

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

    改進的多線程應用程序調試(Altium Designer版本10)

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

    多線程與聊天室程序的創建

    多線程程序的編寫,多線程應用中容易出現的問題。互斥對象的講解,如何采用互斥對象來實現多線程的同步。如何利用命名互斥對象保證應用程序只有
    發表于 05-16 15:22 ?0次下載

    7個好習慣快速提升Python程序性能

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

    C#多線程技術

    程序中,在線程必須等待的時候,CPU可以運行其他線程而不是等待,這就大大提高程序的效率。
    發表于 04-23 11:32 ?15次下載

    利用矢量硬件如何提高應用程序性能

    本次會議演示了識別和修改代碼以利用矢量硬件的過程如何提高應用程序性能
    的頭像 發表于 05-31 11:46 ?1270次閱讀

    Java教程之零點起飛學Java的線程資料說明

    多線程編程是提高應用程序性能的重要手段之。Java平臺從開始就被設計成為多線程環境,從語言級上支持多線
    發表于 02-20 10:41 ?3次下載
    Java教程之零點起飛學Java的<b class='flag-5'>線程</b>資料說明

    如何通過多線程并發設計來提高應用程序性能

    這里我們簡單總結了下,在現代多處理器或多內核環境下,如何通過多線程并發設計來提高我們應用程序性能和響應性。
    的頭像 發表于 09-28 02:13 ?5276次閱讀

    PGO到底是什么?PGO如何提高應用程序性能呢?

    PGO到底是什么?PGO如何提高應用程序性能呢? PGO,全稱為Profile Guided Optimization,譯為“基于特征優化”的技術,是種通過利用應用程序的運行特征數據
    的頭像 發表于 10-26 17:37 ?2019次閱讀

    多線程如何保證數據的同步

    多線程編程是種并發編程的方法,意味著程序中同時運行多個線程,每個線程可獨立執行不同的任務,共享同
    的頭像 發表于 11-17 14:22 ?1163次閱讀

    mfc多線程編程實例

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

    你還是分不清多進程和多線程嗎?文搞懂!

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

    java實現多線程的幾種方式

    Java實現多線程的幾種方式 多線程是指程序中包含了兩個或以上的線程,每個線程都可以并行執行不同的任務或操作。Java中的
    的頭像 發表于 03-14 16:55 ?583次閱讀

    socket 多線程編程實現方法

    是指在同個進程中運行多個線程,每個線程可以獨立執行任務。線程共享進程的資源,如內存空間和文件句柄,但每個線程有自己的
    的頭像 發表于 11-12 14:16 ?239次閱讀