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

優(yōu)化內(nèi)存使用 改善.NET性能

移動開發(fā)
對.NET的性能調(diào)優(yōu)來說,我們有一個普遍被誤解的觀念:規(guī)避內(nèi)存分配的重要性。人們認(rèn)為,由于內(nèi)存分配是快速的,因此很少會對性能產(chǎn)生影響。

對.NET的性能調(diào)優(yōu)來說,我們有一個普遍被誤解的觀念:規(guī)避內(nèi)存分配的重要性。人們認(rèn)為,由于內(nèi)存分配是快速的,因此很少會對性能產(chǎn)生影響。

要理解導(dǎo)致這種誤解的原因,我們必須回到在C++和Visual Basic 4到6中所看到的COM編程時代。對于COM,內(nèi)存是使用引用計(jì)數(shù)形式的垃圾回收器進(jìn)行管理的。每當(dāng)將一個對象分配給一個引用變量時,就會增加一個隱藏的計(jì)數(shù)器。如果變量被重新分配或從作用域退出,計(jì)數(shù)器就會被取消。如果計(jì)數(shù)器達(dá)到0,對象就會被刪除,將內(nèi)存釋放到其他地方。

[[213309]]

這種內(nèi)存管理系統(tǒng)是“確定的”。通過仔細(xì)分析,你可以確定何時刪除一個對象。這意味著你可以自動釋放數(shù)據(jù)庫連接等資源。而對于.NET而言,你需要一個單獨(dú)的機(jī)制(例如,銷毀/啟用)以確保非內(nèi)存資源能夠及時地被釋放。

引用計(jì)數(shù)垃圾收集器有三個主要的缺點(diǎn)。首先,它們?nèi)菀资艿?ldquo;循環(huán)引用”的影響。如果兩個對象相互引用,即使是間接的,那么引用計(jì)數(shù)也不可能降為0,這便會導(dǎo)致內(nèi)存泄漏的發(fā)生。我們必須小心地編寫代碼,要么避免循環(huán)引用,要么提供某種解構(gòu)方法以便在當(dāng)對象不再需要時中斷循環(huán)。

工作在多線程環(huán)境中時會遇到另一個主要的缺點(diǎn)。為了避免競態(tài)條件,某種類型的鎖機(jī)制(例如:鎖住、增量、旋鎖等)需要確保重新計(jì)數(shù)仍然是正確的。這些操作出奇的昂貴。

***,可用內(nèi)存位置的列表可能會變成碎片化的,在活動對象之間會產(chǎn)生許多小的、不可用的空間。內(nèi)存分配通常涉及到遍歷一個有空閑空間的連續(xù)鏈表,以便尋找到一個足夠大的位置來滿足需求對象。(內(nèi)存碎片在.NET中也存在于“大對象堆”或“LOH”。)

相比之下,像.NET或Java那樣將內(nèi)存分配到一個“標(biāo)記-清掃”形式的垃圾回收器中,便是一個簡單的指針增量機(jī)制。賦值并不比分配一個整數(shù)更昂貴。只有當(dāng)GC實(shí)際運(yùn)行時,才會支付實(shí)際成本,而且通常通過使用分代收集器來緩解這種情況。

當(dāng).NET剛出現(xiàn)的時候,許多人抱怨.NET的垃圾回收器不確定性的表現(xiàn)將會損害性能并且難以解釋。當(dāng)時微軟的反駁是,對于大多數(shù)用例來說,盡管間歇的GC會暫停,但“標(biāo)記-清掃”的垃圾回收器實(shí)際上會更快。

不幸的是,隨著時間的推移,這條信息變得有些混亂。即使我們接受這樣一種理論,即“標(biāo)記-清掃”的垃圾回收器速度比引用計(jì)數(shù)更快,但這并不意味著它在絕對意義上是必須的。內(nèi)存分配和相關(guān)的內(nèi)存壓力通常是很難檢測性能問題的原因。

而且,使用的內(nèi)存越多,CPU緩存的效率就越低。雖然主RAM很大,以至于在大多數(shù)用例中幾乎不會使用到基于磁盤的虛擬內(nèi)存,但是相比之下,CPU中的緩存是很小的。從RAM中填充CPU緩存所需的時間可能會占用數(shù)十甚至數(shù)百個CPU周期。

在最近的一篇文章中,F(xiàn)rans Bouma確定了幾種優(yōu)化內(nèi)存使用的技術(shù)。雖然他著重關(guān)注改善ORM性能,但這些建議在各種情況下都很有用。他的這些建議包括:

避免參數(shù)數(shù)組

參數(shù)關(guān)鍵字是有用處的,但與普通的函數(shù)調(diào)用相比要昂貴,因?yàn)樗枰獌?nèi)存分配。API應(yīng)該為常用的參數(shù)計(jì)算提供無參數(shù)重載。

還應(yīng)該提供一個IEnumerable 或者IList的重載,這樣集合在調(diào)用函數(shù)之前就不需要多此一舉的被復(fù)制到一個數(shù)組中了。

如果定義之后立即添加數(shù)據(jù),可先預(yù)定義數(shù)據(jù)結(jié)構(gòu)的大小

List或其他集合類可以在被填充時多次調(diào)整大小。每次調(diào)整大小的操作都會分配另一個內(nèi)部數(shù)組,并由前一個數(shù)組填充。你可以通過為集合的構(gòu)造函數(shù)提供一個容量參數(shù)來避免這種開銷。

惰性的初始化成員

如果你知道一個給定對象在大多數(shù)情況下是不需要的,那么你應(yīng)該使用延遲初始化來避免過早地分配內(nèi)存給它。通常這是手動完成的,因?yàn)長azy 類本身需要分配內(nèi)存。

早在2011年,我們就曾報(bào)道過微軟試圖通過使用類似技術(shù)來減少任務(wù)的規(guī)模。他們的報(bào)告顯示,在創(chuàng)建一個任務(wù)的時候花費(fèi)的時間減少了49%到55%,所需空間大小減少了52%。

責(zé)任編輯:未麗燕 來源: 程序師
相關(guān)推薦

2021-05-28 09:10:40

JavaScript性能GPU

2019-08-21 10:53:29

.NET性能優(yōu)化

2010-05-20 18:40:33

IIS服務(wù)器

2020-12-01 06:53:37

GPUJavaScript

2010-11-08 10:07:23

SQL Server內(nèi)

2023-08-31 08:36:52

.NET性能測試開源

2009-06-29 10:19:42

.NET Micro性能優(yōu)化

2015-09-16 15:21:23

Android性能優(yōu)化內(nèi)存

2016-12-22 17:21:11

Android性能優(yōu)化內(nèi)存泄漏

2017-03-14 18:48:06

Android性能優(yōu)化內(nèi)存優(yōu)化

2024-06-11 09:00:00

異步編程代碼

2025-03-28 08:35:00

2009-08-13 15:49:18

ASP.NET性能優(yōu)化

2011-10-19 09:41:15

ASP.NET性能優(yōu)化

2014-08-27 10:24:33

.NETC#

2009-08-13 16:22:18

ASP.NET性能優(yōu)化

2012-05-16 10:24:26

ASP.NET性能優(yōu)化

2020-12-21 08:32:07

內(nèi)存性能優(yōu)化

2010-08-03 10:04:51

Linux Kerne

2014-08-14 10:04:19

OpenStackDHCP
點(diǎn)贊
收藏

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