日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编写高性能Web应用程序的10个技巧

發布時間:2024/6/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写高性能Web应用程序的10个技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
編寫高性能Web應用程序的10個技巧
linux寶庫 收集整理  作者:linux寶庫  時間:2007-09-30  收藏本站
來自:linux寶庫
聯系:linuxmine#gmail.com
分類:[ASP.NET]

  用 ASP.NET 編寫 Web 應用程序其輕松程度令人難以置信。它是如此的容易,以至于許多開發人員不用花費多少時間來構筑其應用便能獲得非常好的性能。在本文中,我將給出10個編寫高性能 Web 應用的技巧。我的評論不僅僅局限與 ASP.NET 應用,因為它們只是 Web 應用的一個子集。本文也不是 Web 應用性能調整的權威指南――這方面的內容可以寫成一本書。相反,本文可以被視作一個好的起點。

  在廢寢忘食地工作之前,我常常要去攀巖。在攀巖之前,我總是要看一下指南手冊中的線路并閱讀以前來此一游的人留下的建議和忠告。但是,不管指南手冊有多磨好,在嘗試一次特定的具有挑戰性的攀爬之前,你都必須付諸實際的行動。同樣,在你面臨解決的性能問題或者營運一個高吞吐量的站點之前,你只能想方設法編寫高性能 Web 應用程序。

  我們個人經驗來自在微軟 ASP.NET 團隊從事底層架構程序經理,運行和管理 www.asp.net ,并協助架構 Community Server 過程中的經歷,Community Server 是幾個有名的 ASP.NET 應用程序的下一個版本(它將 ASP.NET Forums,.Text 和 nGallery 整合到一個平臺)。我確信這些幫助過我的技巧也會對你有所裨益。

  你應該考慮將應用程序分離成幾個邏輯層。你可能聽說過術語3-層(或n-層)物理體系結構。它們通常是跨進程和/或硬件對功能進行物理劃分的規定的體系結構模式。當系統需要伸縮時,更多的硬件能被添加。然而,總是應該避免與進程和機器忙碌程度相關的性能問題。所以,不管什么時候,只要可能,都要在相同的應用中一起運行 ASP.NET 頁面及其相關的組件。

  由于代碼和層之間的邊界分離,使用 Web 服務或遠程調用將降低20%以上的性能。

  數據層則稍微有些不同,因為數據庫通常都用專門的硬件。但是,數據庫的處理成本仍然很高,因此最優化代碼時,數據層的性能應該是首當其充要關注的地方。

  在著手解決你的應用程序的性能問題之前,一定要剖析應用程序,確定問題之所在。獲取關鍵的性能計數器值(如實現垃圾收集所花時間之百分比的性能計數器的值)對于查找應用程序在何處最耗時也是非常重要的。憑借直覺常常也能找到耗時所在。

  本文所描述的性能改進有兩種類型:大型優化,如使用 ASP.NET Cache,以及不斷重復進行的微型優化。這些微型優化有時很有意思。對代碼的小小改動便會引起很大的動靜,產生成千次的調用。對于大型優化,你可能會看到整體性能的大跳躍。而對微型優化,給定請求可能只是毫秒級的調整,但按每天的請求總數計算,其結果的改進可能是巨大的。

  數據層的性能

  當調整某個應用程序的性能時,有一個簡單的試金石,你可以用它按先后次序:檢查代碼是否存取數據庫?如果是,多長時間存取一次?注意相同的測試也可以被應用于使用 Web 服務或遠程調用的代碼,但我們本文中不涉及這方面內容。

  如果在特定的代碼流程中必須具有對數據庫的請求以及要考察其它方面,如:想對字符串處理進行優先優化,那么暫且把它放一放,先按照上面定好的優先次序來做。除非你有異乎尋常的性能問題,否則你的時間應該用在嘗試最優化與數據庫的連接所花的時間,返回的數據量以及多長時間往返一次和數據庫的通訊上。

  有了這些概括信息,下面就讓我們來看看能幫助你改善應用程序性能的十個技巧。我將從能獲得最顯著效果的改變開始。

  技巧 1 ―― 返回多個結果集

  復審你的數據庫代碼,看看是否有多于一次的對數據庫的訪問請求。這樣每次往返數據庫都降低你的應用程序能處理的每秒請求數。通過在單個數據庫請求中返回多結果集,你能降低與數據庫通信的總體時間。同時你也將使系統更具伸縮性,因為你減少了數據庫服務器處理請求的負擔。

  雖然你可以用動態 SQL 返回多結果集,我更喜歡使用存儲過過程。是否將業務邏輯駐留在存儲過程當中是個有待爭論的問題,但我認為,如果存儲過程中的邏輯能約束返回的數據(降低數據集的尺寸,在網絡上傳輸的時間以及邏輯層不必過慮數據),這是一件好事情。

  使用 SqlCommand 命令實例及其 ExecuteReader 方法來處理強類型的各個業務類,你通過調用 NextResult 可以向前移動結果集指針。Figure 1 示范了處理幾個帶類型的 ArrayLists 例子會話。從數據庫只返回你需要的數據還會降低服務器上內存的分配。

  技巧 2 ―― 分頁數據存取

  ASP.NET DataGrid 提供了非常好的能力:數據分頁支持。當啟用 DataGrid 中的分頁功能,則每次只顯示固定數量的記錄。此外,分頁用戶界面也會顯示在 DataGrid 底部用于導航記錄。分頁用戶界面允許你向前向后導航所顯示的記錄,一次顯示固定數量的記錄。

  有一個美中不足的是用 DataGrid 分頁需要將所有數據邦定到此柵格控件(gird)。例如,你的數據層必須返回所有數據,然后 DataGrid 將根據當前頁過濾掉所有顯示的記錄。當你通過 DataGrid 進行分頁時,如果有 100,000 條記錄被返回,那么每個請求有 99,975 條記錄將被廢棄掉(假設頁尺寸為 25)。當記錄數不斷增加,此應用程序的性能便會遭受痛苦,因為每次請求所要發送的數據會越來越多。

  編寫較好的分頁代碼的一個好的方法是用存儲過程。Figure 2 示范了一個用 Northwind 數據庫中 Orders 表通過存儲過程分頁的例子。很簡單,只要你在頁面中傳遞索引以及頁尺寸即可。相應的結果集先被計算然后被返回。

  在 Community Server 中,我們編寫了幾個分頁控件來完成數據分頁。你將會看到,我使用了技巧 1 中討論的思路,從一個存儲過程中返回連個結果集:總記錄數和請求的數據。

  返回的總記錄數依賴于所執行的查詢不同而不同。例如,某個 WHERE 子句可被用于約束返回的數據。為了計算在分頁用戶界面顯示的總頁數,返回的總記錄數必須是已知的。例如,如果有 1,000,000 條記錄,用一個 WHERE 子句對之過濾后為 1,000 條記錄,則分頁邏輯必須要知道總記錄數以便在分頁用戶界面中正確呈現。

  技巧 3 ―― 連接池

  建立 Web 應用程序與 SQL Server 之間的 TCP 連接是一項昂貴的操作。微軟的開發人員利用連接池技術已經有好長一段時間了,這個技術使他們能重用到數據庫的連接。而不是每次請求都建立新的 TCP 連接,新連接僅在連接池中得不到連接時才建立。當連接被關閉時,它被返回到連接池中,在那里它仍然保持與數據庫的連接,與完全斷開 TCP 連接相反。

  當然,你需要提防泄漏的連接。當你處理完畢,一定要關閉連接。重申一次:不管人們怎么吹噓微軟 .NET 框架中的垃圾收集特性,每當你處理完畢,一定要顯式地調用連接對象的 Close 或 Dispose 方法。不要指望公共語言運行時(CLR)來為你定時清除和關閉連接。CLR 最終將銷毀類并強行關閉連接,但你無法保證該對象的垃圾收集屆時會起作用。

  為了充分用好連接池,有幾條規則必須了然于心。首先,打開連接,進行處理,然后關閉連接。寧愿每個請求的連接打開和關閉多次,也不要保持連接打開狀態以及在不同的方法間將它傳來傳去。其次,使用相同的連接串(如果你使用集成身份檢查,那么也要用相同的線程身份)。如果你不用相同的連接串,例如,根據登錄用戶來定制連接串,你將無法得到連接池所提供的相同的最優化值。當模擬大用戶量情形時,如果你使用集成身份檢查,那么你的連接池將效力大減。.NET CLR 數據性能計數器在試圖跟蹤任何與連接池有關的性能問題時是非常有用的。

  不管什么時候,只要你的應用程序連接到運行在其它進程中的資源,比如某個數據庫,你都應該針對連接到資源所耗時間,發送和接收數據所耗時間以及往返次數進行優化。為了實現較好的性能,應該首當其充優化應用程序中任何種類的忙碌進程。

  應用層包含到數據層的連接以及將數據轉換成有意義的類實例和業務處理的邏輯。以 Community Server 為例,你要在其中處理 Forums 和 Threads 集合;以及應用許可這樣的業務規則;尤其重要的是緩沖(Caching)邏輯也實現其中。

  技巧 4 ―― ASP.NET Cache API

  在編寫代碼之前要做的頭等大事之一是最大限度地構建應用層并發掘 ASP.NET 的 Cache 特性。

  如果你的組件在 ASP.NET 應用程序內運行,那么你只需要在應用程序工程中引用 System.Web.dll 即可。當你需要訪問 Cache 時,用 HttpRuntime.Cache 屬性(相同的對象也可以通過 Page.Cache 和 HttpContext.Cache 訪問)。

  緩沖數據有幾個準則。首先,如果數據能被使用多次,緩沖是個好的后選方案。其次,如果數據對給定請求或用戶是一般的數據而非專用數據,那么最好是選擇緩沖。如果數據用戶或請求專用,如果需要保存期很長但可能不被經常使用,那么仍然要用緩沖。第三,常常被忽略的一個準則是有時緩沖太多的東西。一般來說,在x86機器上,為了降低內存不足錯誤的幾率,運行某個進程不要超過800MB私有字節。因此,緩沖應該有個上限。換句話說,你也許能重用某個計算的結果,但如果該計算有10個參數,你可能試圖針對10個置換進行緩沖,這樣做可能會給你帶來麻煩。ASP.NET 提供的最常見的容錯是由覆蓋緩沖導致的內存不足錯誤,尤其是大型數據集。

  Cache 有幾個重要特性是必須要了解的。第一個是 Cache 實現了最近最少使用(least-recently-used)算法,允許 ASP.NET 強制 Cache 清除操作 ―― 如果可用內存下降到低水平 ―― 則自動從 Cache 中刪除不使用的項目。第二個是 Cache 支持依賴性到期特性,它能強制包括時間,鍵值,文件失效。時間常常被使用,但 ASP.NET 2.0 引入了具有更強大的失效類型:數據庫緩沖失效。也就是當數據庫中的數據改變時,緩沖中的條目會自動刪除。有關
本文來自:http://www.linuxpk.com/48002.html

轉載于:https://www.cnblogs.com/38809972/articles/988882.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的编写高性能Web应用程序的10个技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。