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

多線程一定能優化程序性能嗎?

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

?大家好,我是小風哥。問:如果一個和尚挑水喝,兩個和尚抬水喝,三個和尚沒水喝,那么眾人拾柴一定火焰高嗎?

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

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

多線程與CPU

多線程與CPU是程序員了解的最多的,我們知道多線的目的之一在于充分利用多核,但這里有個前提就是你要處理的任務真的能拆分成獨立的子任務。

圖片

舉個例子,如果你想對一個數組所有元素的和,那么這個任務就可以拆分成為兩個獨立的子任務:任務A計算前一半數組元素的和,任務B計算后一半數組元素的和,然后任務A和任務B分別交給兩個線程來執行。

如果是在多核系統下這類多線程并行處理將顯著提高程序性能,但這種使用多線程充分利用多核帶來的性能提升是有上限的。

道理很簡單,這就好比蓋房子,蓋房子算是個不大不小的工程,讓一個人來完成也不是不可以,但再來六七個人顯然能加快工程速度,但是再來成百上千工人來蓋一棟房子可能速度反而會變慢,畢竟資源是有限的(可用的工具等),人一多需要用在協調上的時間就會變多,多線程也是同樣的道理,當線程數量超過某個臨界點時操作系統就開始忙不過來了(頻繁調度切換),我稱之為三個和尚沒水喝現象。

圖片

圖片但如果系統是單核的,那么這種任務拆分則不會有什么效果,因為不管你創建多少線程真正工作的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系統中必須有能確保一致性的協議,否則程序可能會讀取到錯誤的(過期的)數據。

圖片

圖片然而這種同步是有性能損耗的,多個線程頻繁操作同一個變量可能導致處理器cache系統需要頻繁在各個核心之間進行同步,極端情況下多線程程序性能甚至比單線程要差。

因此多線程之間能不共享數據就不要共享,如果一定要共享,那么就盡量將其控制在最小范圍,讀寫頻次控制到最少。?

責任編輯:趙寧寧 來源: 碼農的荒島求生
相關推薦

2010-11-15 16:20:33

Oracle系統優化

2022-08-18 08:08:56

TCP連通ECMP

2018-11-20 10:50:00

Java性能優化編程技巧

2013-12-17 17:05:20

iOS性能優化

2020-01-20 14:27:57

程序員數據庫電子商務

2019-10-17 10:10:23

優化Web前端

2024-05-17 13:01:31

C#編程開發

2009-06-15 09:47:12

Java程序內存溢出

2025-05-08 09:11:41

2019-10-29 20:13:43

Java技術程序員

2009-01-08 19:11:39

服務器應用程序SQL Server

2016-12-28 11:23:59

優化iOS程序性

2010-08-10 13:58:00

Flex性能測試

2024-11-05 16:29:57

2013-05-14 10:41:16

Palo AltoNGFWUTM

2010-02-04 09:41:03

Android應用程序

2022-03-31 07:52:01

Java多線程并發

2022-12-15 19:27:33

多線程代碼性能

2010-01-28 09:55:05

性能優化

2022-05-05 11:21:00

程序優化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕亚洲一区二区va在线 | 欧美一区二区三区视频 | 精精国产xxxx视频在线播放 | 午夜影院中文字幕 | 蜜桃av人人夜夜澡人人爽 | 福利片在线观看 | 成人在线亚洲 | 国产精品久久久久久久久免费桃花 | 午夜精| 国产一区二区影院 | 日韩视频一区二区三区 | 天天干天天干 | 少妇特黄a一区二区三区88av | 亚洲欧美日韩中文字幕一区二区三区 | 一区二区三区四区在线 | 国产精品美女久久久久久免费 | 男女免费视频网站 | 精品免费国产一区二区三区 | 久久久久国产一区二区三区四区 | 日韩免费高清视频 | 波多野结衣先锋影音 | 国产精品免费高清 | 亚洲精品一区二区 | 亚洲综合二区 | 精品一区二区三区四区五区 | 一区二区日韩 | 91国内精精品久久久久久婷婷 | av黄色在线 | 成人在线视频观看 | 国产精品久久片 | 日日爽 | 成人欧美一区二区三区在线播放 | 亚洲天堂精品一区 | 在线看一区二区三区 | 久久国产精品72免费观看 | 免费人成激情视频在线观看冫 | 国产成人精品999在线观看 | 午夜精品久久久久久久久久久久久 | 成人午夜在线观看 | 丁香五月网久久综合 | 亚洲一一在线 |