[翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 选择什么来衡量
選擇什么來衡量
在搜集數(shù)據(jù)測試數(shù)據(jù)前,你需要知道你要以怎樣的指標(biāo)來衡量測試結(jié)果。這聽起來很容易,但實(shí)際上比你想象中的要難許多。如果你想降低內(nèi)存使用量,你會選擇什么方式呢?
私有工作集(Private working set)
提交大小(Commit size)
內(nèi)存頁(Paged pool)
峰值大小(Peak working set)
內(nèi)存堆大小(.NET heap size)
大對象堆(Large object heap)
and so on
為了追蹤內(nèi)存的使用情況,我們還需要記錄一個(gè)小時(shí)內(nèi)的平均值和峰值?內(nèi)存與處理器進(jìn)程負(fù)載的關(guān)系?正如你所看到的,隨便就能舉出十幾個(gè)甚至更多與內(nèi)存相關(guān)的性能指標(biāo)。
我們需要盡可能的準(zhǔn)確描述要測試的東西
一旦你決定要測試某個(gè)產(chǎn)品,你需要為每個(gè)性能指標(biāo)提出一個(gè)目標(biāo)。在早期開發(fā)階段,訂立的目標(biāo)可能不夠準(zhǔn)確,或者與實(shí)際情況不符。但重點(diǎn)是,不是說一定要達(dá)到一開始規(guī)劃的目標(biāo),而是強(qiáng)迫你構(gòu)建一套可以自動測試你說提出這些性能指標(biāo)的體系結(jié)構(gòu)。
你的目標(biāo)應(yīng)該是可量化的嗎,你的程序目標(biāo)也許是“快”,這個(gè)是一個(gè)不錯(cuò)的指標(biāo),但不是一個(gè)好的指標(biāo),因?yàn)椤翱臁笔且粋€(gè)很主觀的因素,你沒有一個(gè)明確的東西來表示你是否達(dá)到了快這個(gè)目標(biāo)。你需要給目標(biāo)定一個(gè)數(shù)字,并且這個(gè)數(shù)字是要可以測試出來的。
壞:“用戶界面需要正常相應(yīng)”
好:“任何操作不應(yīng)該造成UI線程卡住超過20毫秒”
能量化還不夠好,還需要有更具體的描述,例如下面說的內(nèi)存指標(biāo)
壞:“內(nèi)存應(yīng)小于1G”
好:“內(nèi)存在 100次/秒的峰值查詢情況下,內(nèi)存使用不超過1G”
對于第二個(gè)例子,給出了一個(gè)具體的情景,要在這個(gè)情景下達(dá)成怎樣的目標(biāo)就是一個(gè)比較好的測試用例
另外一個(gè)重要的決定性因素,是你寫的應(yīng)用的目標(biāo)是什么。如果是以一個(gè)帶GUI界面的引用,那么你需要必須保證任何時(shí)刻都能響應(yīng)用戶的操作請求。如果你寫的是一個(gè)每秒處理幾百幾千訪問的服務(wù)器程序,你的目標(biāo)就算要保證I/O和CPU的利用率在一個(gè)很低的范圍內(nèi)。如果你設(shè)計(jì)的是一個(gè)與市面上不一樣的服務(wù)器應(yīng)用,那么從效率的角度上看,一旦你的架構(gòu)除出問題(性能上的),在重新修改架構(gòu)就非常麻煩了。
在設(shè)計(jì)新系統(tǒng)時(shí),我們需要對性能指標(biāo)做一些規(guī)劃。這時(shí)你需要了解一些會對性能產(chǎn)生影響的地方,例如CPU,內(nèi)存,IO的使用率等情況。舉個(gè)栗子,如果你有一臺16核,64G內(nèi)存的機(jī)器以及10G的網(wǎng)絡(luò)帶寬,這時(shí)候你需要設(shè)定好一個(gè)閾值,如“每秒可以處理多少數(shù)據(jù)”,這個(gè)可以在一臺機(jī)器無法滿足需要時(shí),你知道你還需要多少臺機(jī)器。這些信息都是你在做規(guī)劃時(shí)需要寫在規(guī)劃目標(biāo)里的。
你可能聽過 _Donald Knuth 說過的:“過早優(yōu)化是萬惡之源”。但這只適合代碼級別的優(yōu)化。你必須清楚你在設(shè)計(jì)上的缺陷會對應(yīng)用產(chǎn)生多大的影響。你必須把性能目標(biāo)考慮到設(shè)計(jì)中。你必須在一開始時(shí)就有一個(gè)明確的目標(biāo)。性能和安全以及一些東西時(shí)不能事后設(shè)計(jì),否則你會被架構(gòu)重構(gòu)教會你做人的道理。
性能分析(設(shè)計(jì))放在項(xiàng)目的開始,比在寫完代碼后進(jìn)入測試階段再考慮性能,思路是不一樣的。在項(xiàng)目開始前,你可以設(shè)計(jì)出達(dá)到你想要的在性能上的擴(kuò)展性,而不會陷入一些架構(gòu)陷阱里(我暫時(shí)沒明白這里說的架構(gòu)陷阱是指那些東西)。在進(jìn)入項(xiàng)目的測試,部署和維護(hù)階段,你才有更多的時(shí)間在代碼層級的優(yōu)化上,對熱點(diǎn)函數(shù)代碼做分析,減少cpu,內(nèi)存的消耗。
最后,你需要了解Ahmdals定律(See [pdf]:http://www.writinghighperf.net/go/3),特別是如何適用于順序(序列化)編程以及選擇哪個(gè)部分進(jìn)行優(yōu)化。在代碼級別的優(yōu)化堆整體性能用處不大,甚至?xí)速M(fèi)時(shí)間。但你總是希望優(yōu)化代碼里效率最低的那部分。不過,聰明的你應(yīng)該會知道,你不會有足夠時(shí)間去干這件事情。這就是為什么你需要有一個(gè)好的性能監(jiān)控系統(tǒng)(工具),否則,你甚至不知道從哪里改起。
原文地址:http://www.cnblogs.com/yahle/p/6267039.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的[翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 选择什么来衡量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Identity Service - 解
- 下一篇: [.NET跨平台]Jexus独立版本的便