廉頗老矣,尚能飯否

          java:從技術(shù)到管理

          導(dǎo)航

          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          公告

          廉頗老矣,尚能飯否
           
          java博客 : http://www.aygfsteel.com/liudecai
               
          EMAIL:liudecai_zan@126.com 

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章檔案

          相冊(cè)

          閱讀排行榜

          評(píng)論排行榜

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          Web應(yīng)用程序性能調(diào)優(yōu)【轉(zhuǎn)載】

          Web應(yīng)用程序性能調(diào)優(yōu)
          1.1 背景介紹
          性能考慮必須貫穿在日常的編碼中,性能監(jiān)控要列入QA日常工作,每個(gè)程序員都要懂得如何做性能調(diào)優(yōu)。性能往往與程序性能、數(shù)據(jù)量、瀏覽器性能負(fù)載、服務(wù)器負(fù)載、網(wǎng)絡(luò)帶寬

          等都有關(guān)系。
          1.2 技術(shù)知識(shí)點(diǎn)
          1.2.1 相關(guān)工具
          程序性能是否存在問(wèn)題,必須以實(shí)際的監(jiān)控?cái)?shù)據(jù)作為參考,包括請(qǐng)求開始時(shí)間、持續(xù)時(shí)長(zhǎng)、頁(yè)面大小、數(shù)據(jù)量等等。這里介紹幾種常用的監(jiān)控工具。
          1.2.1.1 Firebug
          Firefox插件,版本V1.2.1,提供對(duì)HTML、CSS、腳本、Dom、網(wǎng)絡(luò)、Cookie等的監(jiān)控。性能調(diào)優(yōu)主要利用網(wǎng)絡(luò)選項(xiàng),監(jiān)控請(qǐng)求執(zhí)行的時(shí)間;必要時(shí)也可以監(jiān)控HTML、腳本和Cookie。

          適用于Firefox環(huán)境,監(jiān)控單次請(qǐng)求頁(yè)面和單詞的Http Web請(qǐng)求,免費(fèi)。 https://addons.mozilla.org/zh-CN/firefox/addon/1843
           
          1.2.1.2 Http Watch
          IE、Firefox插件,版本V6.0.17。V5.x版本只適用于IE。提供對(duì)單個(gè)Http Web請(qǐng)求的監(jiān)控,包括其Header、Cookie、Cache、Content等等,其Time Chart提供對(duì)發(fā)送、等待、接收

          三個(gè)階段時(shí)長(zhǎng)的精確監(jiān)控。收費(fèi),有破解。 http://www.httpwatch.com/
           
          1.2.1.3 Fiddler2
          獨(dú)立程序,版本V2.1.9.4 Beta,提供對(duì)所有IE發(fā)出的Http Web請(qǐng)求的監(jiān)控,包括Header、Content、Time Line、Catch等。適用于需要對(duì)Http Web請(qǐng)求和響應(yīng)內(nèi)容的詳細(xì)監(jiān)控。免

          費(fèi),基于.NET構(gòu)建,需要安裝.NET Framework。http://www.fiddler2.com/fiddler2/
           

          1.2.1.4 Pingdom
          免費(fèi)的整站測(cè)試工具,其模擬瀏覽器載入指定頁(yè)面的所有資源,包括HTM;、CSS、Javascript等所有對(duì)象,并在時(shí)間軸面板上顯示每個(gè)對(duì)象載入的具體時(shí)間。如下圖所示。
          http://tools.pingdom.com
           
          1.2.1.5 MSSQL Server Profile
          MSSQL Server 2005的組成部分,對(duì)數(shù)據(jù)庫(kù)性能進(jìn)行監(jiān)控。通常用于監(jiān)控是否多次執(zhí)行特定存儲(chǔ)過(guò)程,以及特定存儲(chǔ)過(guò)程執(zhí)行的時(shí)長(zhǎng)。這里不贅述。
           
          1.2.1.6 VS Studio Trace
          VS Studio Debug工具的一部分,用于在程序中輸出相應(yīng)的調(diào)試信息,由此監(jiān)控特定方法執(zhí)行的時(shí)長(zhǎng);允許在web.config中控制是否輸出調(diào)試信息。通常搭配trace.axd監(jiān)控POST請(qǐng)

          求。適用于單個(gè)頁(yè)面對(duì)每個(gè)方法執(zhí)行時(shí)長(zhǎng)的監(jiān)控。
          應(yīng)用程序級(jí)別的Trace
          <configuration>
             <system.web>
             <trace enabled="true" requestLimit="40" localOnly="false" pageOutput ="false"/>
             </system.web>
            </configuration>
          單個(gè)頁(yè)面的Trace
          請(qǐng)?jiān)谠擁?yè)的 @ Page 指令中將 Trace 屬性設(shè)置為 false。將存儲(chǔ)您包括在頁(yè)代碼中的任何 TraceContext.Write 或 TraceContext.Warn 語(yǔ)句,并且它們只返回到跟蹤查看器。 

          如果希望跟蹤信息附加到與其關(guān)聯(lián)的頁(yè)的末尾,請(qǐng)?jiān)?Web.config 文件的跟蹤配置節(jié)中將 pageOutput 屬性設(shè)置為 true。如果要跟蹤信息只顯示在跟蹤查看器中,則將該屬性設(shè)置

          為 false。如果您啟用應(yīng)用程序級(jí)跟蹤,但不想顯示應(yīng)用程序某些頁(yè)的跟蹤信息,則使用 @ Page 指令將不想顯示 跟蹤信息的頁(yè)的 Trace 屬性設(shè)置為 false。
          通過(guò)http://localhost/trace.axd 查看Get和Post的跟蹤信息。
           
          1.2.2 調(diào)優(yōu)方向
          1.2.2.1 單個(gè)請(qǐng)求或方法執(zhí)行時(shí)間特別長(zhǎng)
          問(wèn)題描述
          由于代碼、數(shù)據(jù)量、存儲(chǔ)過(guò)程等原因,導(dǎo)致某個(gè)請(qǐng)求或者方法執(zhí)行時(shí)間特別長(zhǎng),導(dǎo)致性能瓶頸。比如Order Complete頁(yè)面(DDN-622,DDN-624),通過(guò)UPS實(shí)時(shí)獲取Delivery Date

          耗時(shí)需要1秒。
          如何調(diào)優(yōu)
          查看頁(yè)面代碼、特定方法是否有優(yōu)化的可能性。利用Http Watch監(jiān)控每個(gè)HTTP Web請(qǐng)求,對(duì)于在內(nèi)網(wǎng)執(zhí)行時(shí)間超過(guò)100毫秒(頁(yè)面大小100K以內(nèi))特別留意。必要時(shí)利用Trace監(jiān)控

          相應(yīng)頁(yè)面方法的執(zhí)行時(shí)長(zhǎng),比如Page_Load、相關(guān)響應(yīng)事件等。
           
          1.2.2.2 頁(yè)面數(shù)據(jù)量特別大
          問(wèn)題描述
          由于頁(yè)面數(shù)據(jù)量特別大,在數(shù)據(jù)量獲取(Server一級(jí))、瀏覽器呈現(xiàn)可能會(huì)導(dǎo)致性能。通過(guò)Http Watch監(jiān)控發(fā)送、等待、接收的時(shí)長(zhǎng)。判定是否違反“只取所需”的原則導(dǎo)致數(shù)據(jù)

          冗余。比如,Order Complete頁(yè)面加載需要600毫秒以上(DDN-613),由于加載Order信息時(shí)將Shipping Info、Payment Info也一并加載進(jìn)來(lái),造成在數(shù)據(jù)庫(kù)級(jí)別的數(shù)據(jù)冗余和時(shí)

          間浪費(fèi)。
          如何調(diào)優(yōu)
          只取所需,減少數(shù)據(jù)冗余。
           
          1.2.2.3 頁(yè)面特別大
          問(wèn)題描述
          由于所需呈現(xiàn)的數(shù)據(jù)量特別大,造成HTML頁(yè)面特別大,瀏覽器解析呈現(xiàn)緩慢,造成性能瓶頸。比如Bom的Component Usage、Insertion & Guarantee ,由于矩陣數(shù)據(jù)造成頁(yè)面容量

          超過(guò)2M、4M。
          如何調(diào)優(yōu)
          使用更加緊湊的HTML,減少HTML嵌套,不再使用.NET默認(rèn)的校驗(yàn)器,減少頁(yè)面容量;限制不必要的ViewStage。
           
          1.2.2.4 Javascript性能瓶頸
          問(wèn)題描述
          瀏覽器對(duì)Javascript的執(zhí)行性能差異造成此瓶頸,特別是當(dāng)頁(yè)面比較大的時(shí)候,IE的執(zhí)行效率只有Firefox、 Safari的60%左右。比如document.getElementById()可能造成性能瓶

          頸。
          如何調(diào)優(yōu)
          用JQuery的API替代普通的Javascirpt API,在Javascript一級(jí)緩存數(shù)組。
          1.2.2.5 存儲(chǔ)過(guò)程性能瓶頸
          問(wèn)題描述
          數(shù)據(jù)庫(kù)一級(jí)未做優(yōu)化,比如主鍵、索引,導(dǎo)致查詢效率低下;存儲(chǔ)過(guò)程使用了效率低下的語(yǔ)句,比如IN查詢、臨時(shí)表、實(shí)時(shí)統(tǒng)計(jì)、動(dòng)態(tài)查詢、游標(biāo)循環(huán)等,造成執(zhí)行效率低下。
          如何調(diào)優(yōu)
          建立主鍵、索引,使用效率更高的執(zhí)行語(yǔ)句;用統(tǒng)計(jì)表替代實(shí)時(shí)統(tǒng)計(jì)。參照:080319DatabaseCapability的培訓(xùn)記錄。當(dāng)數(shù)據(jù)量比較小的時(shí)候,通過(guò)定義表變量而不是臨時(shí)表處理


          1.2.2.6 減少HTTP請(qǐng)求次數(shù)
          問(wèn)題描述
          在Javascript循環(huán)中通過(guò)Ajax多次發(fā)起HTTP請(qǐng)求;頁(yè)面中內(nèi)嵌多個(gè)IFRAME;頁(yè)面頻繁刷新或者重載。
          如何調(diào)優(yōu)
          不在循環(huán)中發(fā)起HTTP請(qǐng)求;適當(dāng)?shù)臄?shù)據(jù)和頁(yè)面緩存;減少內(nèi)嵌IFRAME的使用。避免頁(yè)面頻繁刷新。
          1.2.2.7 避免多次調(diào)用數(shù)據(jù)庫(kù)
          問(wèn)題描述
          在方法循環(huán)中多次調(diào)用業(yè)務(wù)類訪問(wèn)數(shù)據(jù)庫(kù),比如For each、Data Bind、Date Item Bound。MSSSQL Server Profile能監(jiān)控到此類操作。
          如何調(diào)優(yōu)
          避免多次調(diào)用數(shù)據(jù)庫(kù),如確實(shí)需要查詢,在數(shù)據(jù)量少的情況下,將數(shù)據(jù)緩存在內(nèi)存并在緩存中查詢。
          1.2.3 調(diào)優(yōu)步驟
          ? 結(jié)合Http Watch、Firebug確認(rèn)每個(gè)頁(yè)面請(qǐng)求的執(zhí)行時(shí)長(zhǎng),憑經(jīng)驗(yàn)判定是否存在性能瓶頸。
          ? 在頁(yè)面適當(dāng)位置添加trace信息,確認(rèn)哪些方法比較費(fèi)時(shí)。
          ? 代碼審查,查找存在問(wèn)題的代碼、存儲(chǔ)過(guò)程、腳本。
          ? 確認(rèn)每次查詢的數(shù)據(jù)量和預(yù)期結(jié)果,過(guò)濾冗余數(shù)據(jù)。
          ? 調(diào)優(yōu)后,程序性能須有數(shù)量級(jí)上的改善。
          1.2.4 代碼規(guī)范
          ? 嚴(yán)格執(zhí)行公司的代碼規(guī)范,特別是命名、存儲(chǔ)過(guò)程規(guī)范。
          ? 每次代碼提交之前,利用SVN DIFF工具確認(rèn)每個(gè)代碼修改,確認(rèn)無(wú)誤后再提交。
          ? 每一個(gè)分出去的Issue,導(dǎo)師、PM、Team Leader必須做到代碼審查。
          ? 不重復(fù)制造輪子,注意代碼封裝和復(fù)用,不制造冗余代碼。
          ? 對(duì)Cookie、Session集中管理,KEY要管理起來(lái);不再使用的代碼、方法要及時(shí)刪除。
          1.3 項(xiàng)目實(shí)踐
          1.3.1 監(jiān)控每個(gè)頁(yè)面的執(zhí)行時(shí)長(zhǎng)
          利用Firebug、Http Watch、Filddler2、Pingdom分別監(jiān)控可疑頁(yè)面的執(zhí)行時(shí)長(zhǎng),判斷可能導(dǎo)致頁(yè)面性能低下的代碼塊。
          1.3.2 監(jiān)控Profile
          對(duì)可疑代碼進(jìn)行代碼審查,如果懷疑是由于存儲(chǔ)過(guò)程等原因?qū)е碌臄?shù)據(jù)庫(kù)性能低下,結(jié)合MSSQL Server Profile監(jiān)控可疑存儲(chǔ)過(guò)程或者表結(jié)構(gòu)。
          1.3.3 Trace監(jiān)控方法執(zhí)行的時(shí)長(zhǎng)
          對(duì)可疑代碼進(jìn)行代碼審查,如果懷疑是由于C#代碼導(dǎo)致的頁(yè)面性能低下,結(jié)合VS Studio Trace監(jiān)控代碼段的執(zhí)行時(shí)長(zhǎng)。
          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) 評(píng)論(0)  編輯  收藏 所屬分類: 程序人生

          主站蜘蛛池模板: 顺义区| 米脂县| 兴城市| 台州市| 闽清县| 南安市| 镇原县| 天台县| 资中县| 疏附县| 青岛市| 长寿区| 台安县| 昆山市| 金堂县| 攀枝花市| 阿拉尔市| 工布江达县| 镇宁| 克拉玛依市| 武平县| 安吉县| 嫩江县| 新晃| 剑河县| 无棣县| 台东县| 迁安市| 尼木县| 荆门市| 五常市| 两当县| 嘉祥县| 胶州市| 商南县| 朝阳市| 岳阳县| 城步| 榆社县| 井冈山市| 娱乐|