Web應(yīng)用程序性能調(diào)優(yōu)【轉(zhuǎn)載】
Web應(yīng)用程序性能調(diào)優(yōu)
1.1 背景介紹
性能考慮必須貫穿在日常的編碼中,性能監(jiān)控要列入QA日常工作,每個程序員都要懂得如何做性能調(diào)優(yōu)。性能往往與程序性能、數(shù)據(jù)量、瀏覽器性能負載、服務(wù)器負載、網(wǎng)絡(luò)帶寬
等都有關(guān)系。
1.2 技術(shù)知識點
1.2.1 相關(guān)工具
程序性能是否存在問題,必須以實際的監(jiān)控數(shù)據(jù)作為參考,包括請求開始時間、持續(xù)時長、頁面大小、數(shù)據(jù)量等等。這里介紹幾種常用的監(jiān)控工具。
1.2.1.1 Firebug
Firefox插件,版本V1.2.1,提供對HTML、CSS、腳本、Dom、網(wǎng)絡(luò)、Cookie等的監(jiān)控。性能調(diào)優(yōu)主要利用網(wǎng)絡(luò)選項,監(jiān)控請求執(zhí)行的時間;必要時也可以監(jiān)控HTML、腳本和Cookie。
適用于Firefox環(huán)境,監(jiān)控單次請求頁面和單詞的Http Web請求,免費。 https://addons.mozilla.org/zh-CN/firefox/addon/1843
1.2.1.2 Http Watch
IE、Firefox插件,版本V6.0.17。V5.x版本只適用于IE。提供對單個Http Web請求的監(jiān)控,包括其Header、Cookie、Cache、Content等等,其Time Chart提供對發(fā)送、等待、接收
三個階段時長的精確監(jiān)控。收費,有破解。 http://www.httpwatch.com/
1.2.1.3 Fiddler2
獨立程序,版本V2.1.9.4 Beta,提供對所有IE發(fā)出的Http Web請求的監(jiān)控,包括Header、Content、Time Line、Catch等。適用于需要對Http Web請求和響應(yīng)內(nèi)容的詳細監(jiān)控。免
費,基于.NET構(gòu)建,需要安裝.NET Framework。http://www.fiddler2.com/fiddler2/
1.2.1.4 Pingdom
免費的整站測試工具,其模擬瀏覽器載入指定頁面的所有資源,包括HTM;、CSS、Javascript等所有對象,并在時間軸面板上顯示每個對象載入的具體時間。如下圖所示。
http://tools.pingdom.com
1.2.1.5 MSSQL Server Profile
MSSQL Server 2005的組成部分,對數(shù)據(jù)庫性能進行監(jiān)控。通常用于監(jiān)控是否多次執(zhí)行特定存儲過程,以及特定存儲過程執(zhí)行的時長。這里不贅述。
1.2.1.6 VS Studio Trace
VS Studio Debug工具的一部分,用于在程序中輸出相應(yīng)的調(diào)試信息,由此監(jiān)控特定方法執(zhí)行的時長;允許在web.config中控制是否輸出調(diào)試信息。通常搭配trace.axd監(jiān)控POST請
求。適用于單個頁面對每個方法執(zhí)行時長的監(jiān)控。
應(yīng)用程序級別的Trace
<configuration>
<system.web>
<trace enabled="true" requestLimit="40" localOnly="false" pageOutput ="false"/>
</system.web>
</configuration>
單個頁面的Trace
請在該頁的 @ Page 指令中將 Trace 屬性設(shè)置為 false。將存儲您包括在頁代碼中的任何 TraceContext.Write 或 TraceContext.Warn 語句,并且它們只返回到跟蹤查看器。
如果希望跟蹤信息附加到與其關(guān)聯(lián)的頁的末尾,請在 Web.config 文件的跟蹤配置節(jié)中將 pageOutput 屬性設(shè)置為 true。如果要跟蹤信息只顯示在跟蹤查看器中,則將該屬性設(shè)置
為 false。如果您啟用應(yīng)用程序級跟蹤,但不想顯示應(yīng)用程序某些頁的跟蹤信息,則使用 @ Page 指令將不想顯示 跟蹤信息的頁的 Trace 屬性設(shè)置為 false。
通過http://localhost/trace.axd 查看Get和Post的跟蹤信息。
1.2.2 調(diào)優(yōu)方向
1.2.2.1 單個請求或方法執(zhí)行時間特別長
問題描述
由于代碼、數(shù)據(jù)量、存儲過程等原因,導(dǎo)致某個請求或者方法執(zhí)行時間特別長,導(dǎo)致性能瓶頸。比如Order Complete頁面(DDN-622,DDN-624),通過UPS實時獲取Delivery Date
耗時需要1秒。
如何調(diào)優(yōu)
查看頁面代碼、特定方法是否有優(yōu)化的可能性。利用Http Watch監(jiān)控每個HTTP Web請求,對于在內(nèi)網(wǎng)執(zhí)行時間超過100毫秒(頁面大小100K以內(nèi))特別留意。必要時利用Trace監(jiān)控
相應(yīng)頁面方法的執(zhí)行時長,比如Page_Load、相關(guān)響應(yīng)事件等。
1.2.2.2 頁面數(shù)據(jù)量特別大
問題描述
由于頁面數(shù)據(jù)量特別大,在數(shù)據(jù)量獲取(Server一級)、瀏覽器呈現(xiàn)可能會導(dǎo)致性能。通過Http Watch監(jiān)控發(fā)送、等待、接收的時長。判定是否違反“只取所需”的原則導(dǎo)致數(shù)據(jù)
冗余。比如,Order Complete頁面加載需要600毫秒以上(DDN-613),由于加載Order信息時將Shipping Info、Payment Info也一并加載進來,造成在數(shù)據(jù)庫級別的數(shù)據(jù)冗余和時
間浪費。
如何調(diào)優(yōu)
只取所需,減少數(shù)據(jù)冗余。
1.2.2.3 頁面特別大
問題描述
由于所需呈現(xiàn)的數(shù)據(jù)量特別大,造成HTML頁面特別大,瀏覽器解析呈現(xiàn)緩慢,造成性能瓶頸。比如Bom的Component Usage、Insertion & Guarantee ,由于矩陣數(shù)據(jù)造成頁面容量
超過2M、4M。
如何調(diào)優(yōu)
使用更加緊湊的HTML,減少HTML嵌套,不再使用.NET默認的校驗器,減少頁面容量;限制不必要的ViewStage。
1.2.2.4 Javascript性能瓶頸
問題描述
瀏覽器對Javascript的執(zhí)行性能差異造成此瓶頸,特別是當(dāng)頁面比較大的時候,IE的執(zhí)行效率只有Firefox、 Safari的60%左右。比如document.getElementById()可能造成性能瓶
頸。
如何調(diào)優(yōu)
用JQuery的API替代普通的Javascirpt API,在Javascript一級緩存數(shù)組。
1.2.2.5 存儲過程性能瓶頸
問題描述
數(shù)據(jù)庫一級未做優(yōu)化,比如主鍵、索引,導(dǎo)致查詢效率低下;存儲過程使用了效率低下的語句,比如IN查詢、臨時表、實時統(tǒng)計、動態(tài)查詢、游標(biāo)循環(huán)等,造成執(zhí)行效率低下。
如何調(diào)優(yōu)
建立主鍵、索引,使用效率更高的執(zhí)行語句;用統(tǒng)計表替代實時統(tǒng)計。參照:080319DatabaseCapability的培訓(xùn)記錄。當(dāng)數(shù)據(jù)量比較小的時候,通過定義表變量而不是臨時表處理
。
1.2.2.6 減少HTTP請求次數(shù)
問題描述
在Javascript循環(huán)中通過Ajax多次發(fā)起HTTP請求;頁面中內(nèi)嵌多個IFRAME;頁面頻繁刷新或者重載。
如何調(diào)優(yōu)
不在循環(huán)中發(fā)起HTTP請求;適當(dāng)?shù)臄?shù)據(jù)和頁面緩存;減少內(nèi)嵌IFRAME的使用。避免頁面頻繁刷新。
1.2.2.7 避免多次調(diào)用數(shù)據(jù)庫
問題描述
在方法循環(huán)中多次調(diào)用業(yè)務(wù)類訪問數(shù)據(jù)庫,比如For each、Data Bind、Date Item Bound。MSSSQL Server Profile能監(jiān)控到此類操作。
如何調(diào)優(yōu)
避免多次調(diào)用數(shù)據(jù)庫,如確實需要查詢,在數(shù)據(jù)量少的情況下,將數(shù)據(jù)緩存在內(nèi)存并在緩存中查詢。
1.2.3 調(diào)優(yōu)步驟
? 結(jié)合Http Watch、Firebug確認每個頁面請求的執(zhí)行時長,憑經(jīng)驗判定是否存在性能瓶頸。
? 在頁面適當(dāng)位置添加trace信息,確認哪些方法比較費時。
? 代碼審查,查找存在問題的代碼、存儲過程、腳本。
? 確認每次查詢的數(shù)據(jù)量和預(yù)期結(jié)果,過濾冗余數(shù)據(jù)。
? 調(diào)優(yōu)后,程序性能須有數(shù)量級上的改善。
1.2.4 代碼規(guī)范
? 嚴格執(zhí)行公司的代碼規(guī)范,特別是命名、存儲過程規(guī)范。
? 每次代碼提交之前,利用SVN DIFF工具確認每個代碼修改,確認無誤后再提交。
? 每一個分出去的Issue,導(dǎo)師、PM、Team Leader必須做到代碼審查。
? 不重復(fù)制造輪子,注意代碼封裝和復(fù)用,不制造冗余代碼。
? 對Cookie、Session集中管理,KEY要管理起來;不再使用的代碼、方法要及時刪除。
1.3 項目實踐
1.3.1 監(jiān)控每個頁面的執(zhí)行時長
利用Firebug、Http Watch、Filddler2、Pingdom分別監(jiān)控可疑頁面的執(zhí)行時長,判斷可能導(dǎo)致頁面性能低下的代碼塊。
1.3.2 監(jiān)控Profile
對可疑代碼進行代碼審查,如果懷疑是由于存儲過程等原因?qū)е碌臄?shù)據(jù)庫性能低下,結(jié)合MSSQL Server Profile監(jiān)控可疑存儲過程或者表結(jié)構(gòu)。
1.3.3 Trace監(jiān)控方法執(zhí)行的時長
對可疑代碼進行代碼審查,如果懷疑是由于C#代碼導(dǎo)致的頁面性能低下,結(jié)合VS Studio Trace監(jiān)控代碼段的執(zhí)行時長。
1.4 參考資料
《高性能網(wǎng)站建設(shè)指南》
http://www.cnblogs.com/JeffreyZhao/category/82418.html
http://www.cnblogs.com/FrameWork/archive/2006/10/16/529835.html
http://www.cnblogs.com/FrameWork/archive/2006/10/16/530827.html
1.5 學(xué)習(xí)建議
養(yǎng)成良好的編碼習(xí)慣
避免常見的編碼誤區(qū)
柳德才
13691193654
18942949207
QQ:422157370
liudecai_zan@126.com
湖北-武漢-江夏-廟山
posted on 2009-04-27 16:06 liudecai_zan@126.com 閱讀(1158) 評論(0) 編輯 收藏 所屬分類: 程序人生