自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PLINQ并行開發(fā)中常見性能問題及應(yīng)對方案

開發(fā) 后端
在這里我們將討論到PLINQ開發(fā)中常見性能問題及應(yīng)對方案,這也是PDC2009上放出的重磅消息。

在上月舉行的PDC 09大會上,微軟并行庫團(tuán)隊的開發(fā)工程師Igor Ostrovsky介紹了PLINQ的工作原理,以及多核編程中,尤其是在PLINQ使用過程中幾種常見性能問題及應(yīng)對方法。Igor表示,這些性能問題很少在順序編程中遇到,因此在并行環(huán)境中容易被人忽視。

#T#

第一個性能問題是內(nèi)存分配

由于利用了多核CPU進(jìn)行運算,對象分配的速度也加快了。此外,程序中可以還會出現(xiàn)更高頻率的字符串連接或裝箱操作,這都會使GC壓力增大。.NET應(yīng)用程序所使用的默認(rèn)GC方式為Concurrent GC,它的性能很高,并且為降低應(yīng)用程序的延遲作了很多優(yōu)化。它的最佳使用場景是用戶交互式應(yīng)用,這樣可以盡可能避免用戶界面的停頓,但是它在長期運行的多核程序中表現(xiàn)并不好。而最終的結(jié)果是大量計算時間耗費在GC上,此時應(yīng)用程序算法即便是利用了多個核,也會發(fā)現(xiàn)它的伸縮能力受到了GC限制。解決這個問題的方法之一是減小內(nèi)存分配,例如可以使用值類型來代替引用類型。值類型的對象會分配在線程棧而不是堆上,以此避免對GC產(chǎn)生壓力。第二個方法是在config文件中啟用Server GC。使用Server GC會改變.NET分配對象的方式,此時.NET會為每個核準(zhǔn)備不同的堆,并且獨立進(jìn)行垃圾回收。這樣在一臺4核的機(jī)器上便可以有4個線程同時進(jìn)行垃圾回收,性能自然也就隨著多核而提升了。

第二個性能問題是CPU在局部化(Locality)和緩存方面的問題

在流行的多核架構(gòu)中,每個核都有獨立的二級緩存。CPU并不會緩存單個地址中的數(shù)據(jù),而是緩存以64字節(jié)或128字節(jié)相鄰內(nèi)存的緩存條目(cache line),因此當(dāng)某個核改變了內(nèi)存中的數(shù)據(jù)時,則其他核中地址相鄰的緩存數(shù)據(jù)也會失效,這樣CPU每次進(jìn)行計算時都要從速度較慢的內(nèi)存中加載數(shù)據(jù)。這個性能問題的隱蔽之處在于代碼中的不同數(shù)據(jù)——例如同一個數(shù)組的不同下標(biāo)——可能在內(nèi)存中處在同一個緩存條目中,因此這個問題又被稱為錯誤共享(False Sharing)。Igor演示了一段性能低下的代碼,在這個實現(xiàn)中多個線程會不斷讀寫同一個數(shù)組的相鄰下標(biāo),因此造成了錯誤共享。Igor的修改方法是將數(shù)據(jù)存放在數(shù)組中相距較遠(yuǎn)的下標(biāo),甚至是不同的數(shù)組中。由于CPU的緩存條目大小有限,這種方法可以避免出現(xiàn)錯誤共享。博客園老趙在《計算機(jī)體系結(jié)構(gòu)與程序性能》一文中也提出了一種優(yōu)化方式,他的做法是盡可能使用局部變量來保存計算過程中的中間值,以此減少對數(shù)組的修改操作。由于局部變量分處不同線程的??臻g內(nèi),因此地址相距很遠(yuǎn),不會造成錯誤共享問題。當(dāng)有人問起到這種優(yōu)化方式是否安全時,Igor答到,這其實和CPU架構(gòu)的實現(xiàn)方式有很大關(guān)系。如果某一天緩存實現(xiàn)變化了,可能這種優(yōu)化方式會適得其反。不過在目前主流架構(gòu)中,這樣的做法是比較安全的。Igor補(bǔ)充道,他認(rèn)為這也是為什么“全自動”并行化那么困難的原因之一,因為在并行環(huán)境下影響程序性能的方面實在太多了。

第三個問題在于開發(fā)人員傾向于在PLINQ中使用大量小粒度的委托來完成工作

此時每個委托的計算任務(wù)很小,而委托的執(zhí)行次數(shù)會很多。在計算較長的序列時,小粒度的委托對象也能獲得性能提高,但是它會產(chǎn)生額外的負(fù)載。例如,MoveNext和Current的調(diào)用,以及每個委托的執(zhí)行性能都和虛方法比較接近。此外,一個較長的輸入序列也會受限于內(nèi)存的吞吐量。因此,Igor建議開發(fā)人員在使用PLINQ時盡可能使用計算量較大的委托,以此減少計算主體外的性能開銷。

第四和第五問題則與PLINQ的實現(xiàn)有關(guān)

Igor表示,PLINQ可以并行執(zhí)行所有的LINQ查詢,但是相對于復(fù)雜的LINQ查詢,PLINQ能夠?qū)唵蔚腖INQ操作有更好的優(yōu)化。因此,Igor建議開發(fā)人員在使用PLINQ時可以手動將復(fù)雜的LINQ表達(dá)式拆分為簡單的LINQ查詢,并且只在真正需要大量計算的地方才開始并行化。這種結(jié)合順序執(zhí)行和并行執(zhí)行的方式,可以讓應(yīng)用程序的性能達(dá)到最優(yōu)。此外,為不同的輸入方式選擇不同的分塊(partition)策略對性能的影響很大,因此PLINQ會對數(shù)組和IList<>進(jìn)行靜態(tài)的分割,而對IEnumerable<>集合按實際需求進(jìn)行劃分,而開發(fā)人員也可以通過自定義Partitioner的方式來指定特別的分割策略。

最后,Igor強(qiáng)調(diào),使用并行計算進(jìn)行程序性能優(yōu)化之前,一定要通過合適的評測方式來找到代碼的瓶頸。如果這個瓶頸正符合數(shù)據(jù)并行(data parallel)模式,那么可以使用PLINQ進(jìn)行性能優(yōu)化。而優(yōu)化完成后還需要評測其效果,并使用之前提出的幾種方案進(jìn)行合適的調(diào)整。

PLINQ地位圖

延伸閱讀

PLINQ(Parallel LINQ)。微軟對PLINQ在Parallel FX中的定位是:PLINQ是TPL(Task Parallel Library)的一個高層應(yīng)用。目前PLINQ已經(jīng)被集成到.NET 4.0當(dāng)中了。

責(zé)任編輯:彭凡 來源: infoQ
相關(guān)推薦

2023-11-27 16:39:09

數(shù)字化轉(zhuǎn)型

2022-04-15 11:37:19

密碼網(wǎng)絡(luò)攻擊網(wǎng)絡(luò)安全

2014-11-12 10:23:12

Docker容器IronWorker

2015-05-18 10:13:47

2020-11-02 10:50:21

爬蟲Python網(wǎng)絡(luò)

2019-03-21 14:18:38

iOS開發(fā)優(yōu)化原因

2009-06-30 16:03:00

異常Java

2010-09-01 14:51:12

CSSIEFirefox

2024-06-24 00:30:00

2023-07-12 08:00:40

2022-03-28 12:23:25

企業(yè)內(nèi)部威脅監(jiān)管

2011-04-07 13:22:12

Windows 8

2010-05-12 17:04:20

BlackBerry開

2010-08-31 13:49:12

CSS

2010-09-13 18:11:38

2020-05-09 10:19:01

多云架構(gòu)云平臺云計算

2010-09-07 09:50:35

DIVCSS

2022-03-08 07:56:51

RFID數(shù)據(jù)中心定位

2018-05-26 22:55:53

GDPR

2018-11-06 14:17:23

點贊
收藏

51CTO技術(shù)棧公眾號