改善ASP.NET2.0性能的五件法宝
生活随笔
收集整理的這篇文章主要介紹了
改善ASP.NET2.0性能的五件法宝
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
大多數(shù)ASP.NET程序員都會(huì)遇到這樣的問(wèn)題,當(dāng)我們的web程序開(kāi)發(fā)周期快要結(jié)束的時(shí)候,卻發(fā)現(xiàn)還有很多性能方面的問(wèn)題需要解決。如果您遇到這樣的情況,那真是太糟糕了。也許每一個(gè)開(kāi)發(fā)人員在開(kāi)發(fā)Web程序時(shí)都會(huì)制定一個(gè)目標(biāo),如使用適當(dāng)?shù)膬?nèi)存以及如何處理Web請(qǐng)求等。雖然這些目標(biāo)已經(jīng)制定,但可能仍然會(huì)因?yàn)槭褂媚承╁e(cuò)誤的方法來(lái)改善應(yīng)用程序的性能而使事情變得更糟糕。因此,在本文中將給出了五個(gè)步驟來(lái)優(yōu)化ASP.NET2.0應(yīng)用程序,希望這些要點(diǎn)會(huì)給讀者以啟迪,以便使廣大的開(kāi)發(fā)人員不會(huì)走彎路。
1. 適當(dāng)?shù)靥幚頂?shù)據(jù)訪問(wèn)對(duì)象
如果我們沒(méi)有正確處理數(shù)據(jù)訪問(wèn)對(duì)象,就會(huì)大量消耗我們的服務(wù)器內(nèi)存。當(dāng)建立一個(gè)數(shù)據(jù)訪問(wèn)對(duì)象時(shí),充分理解它們的生命周期以及不需要它們時(shí)如何處置是非常必要的。我經(jīng)常看到很多開(kāi)發(fā)人員建立、打開(kāi)和銷毀DataReader對(duì)象,但卻不對(duì)它做任何處理。如果能確保我們的數(shù)據(jù)訪問(wèn)對(duì)象適當(dāng)?shù)乇还芾?#xff0c;這將在很大程度上解決IIS為什么直接機(jī)器快崩潰時(shí)才釋放內(nèi)存的另人頭痛的問(wèn)題。就先讓我們?cè)诮鉀Q方案中查找關(guān)于DataReader實(shí)例吧,對(duì)于發(fā)現(xiàn)的每一個(gè)DataReader實(shí)例,請(qǐng)確保它們已經(jīng)被關(guān)閉或是被釋放。建議使用try/catch/finally塊來(lái)處理。如下面代碼所示:
using (IDataReader reader = MySite.GetSearchResults())
{
//Consume the datareader
while (reader.Read())
{
//Do something with the data
}
)
使用try/catch/finally 塊
IDataReader reader;
try
{
reader = MyWeb.GetSearchResults();
while (reader.Read())
{
//Do something with the data
}
}
catch (Exception ex)
{
//Log the exception
}
finally
{
//如果這個(gè)對(duì)象存在,dispose這個(gè)對(duì)象
if (reader != null)
reader.Dispose();
}
2. 管理IIS應(yīng)用程序池
在典型的應(yīng)用中,當(dāng)處理一個(gè)Web應(yīng)用程序時(shí),這個(gè)Web程序由多個(gè)部分組成。通常有我們的主Web站點(diǎn),一個(gè)或多個(gè)Web服務(wù),或是一個(gè)圖象處理程序。IIS6為我們提供了為多個(gè)應(yīng)用程序建立程序池的機(jī)會(huì)。應(yīng)用程序池允許我們使應(yīng)用程序在各自的單獨(dú)進(jìn)程中運(yùn)行。這么做的好處是將我們的應(yīng)用程序的不同組成部分分開(kāi),使它們分別運(yùn)行在自己的內(nèi)存空間中。由于每個(gè)處理進(jìn)程的內(nèi)存達(dá)到800-900M時(shí)系統(tǒng)就會(huì)變得很慢,因此,需要應(yīng)用程序分散到不同的處理進(jìn)程中,這樣每個(gè)工作進(jìn)程占有的內(nèi)存就不會(huì)那么大了。這樣會(huì)從某種程度上提高系統(tǒng)運(yùn)行的效率。關(guān)于如果建立應(yīng)用程序池的問(wèn)題,請(qǐng)參閱微軟的相關(guān)技術(shù)文檔。
3. 管理ASP.NET狀態(tài)
為了更進(jìn)一步地改善應(yīng)用程序性能,對(duì)ASP.NET的不同的狀態(tài)類型有一個(gè)深入的了解是非常必要的。ASP.Net有許多不同的狀態(tài),但是我們應(yīng)該弄清楚什么是應(yīng)用程序狀態(tài)、會(huì)話狀態(tài)和profile屬性。因?yàn)檫@些狀態(tài)都保存在服務(wù)器的內(nèi)存上。所有應(yīng)盡量避免保存太多這三種狀態(tài)的數(shù)據(jù),除非有必要保存它們。如果我們需要在會(huì)話狀態(tài)保存數(shù)據(jù),就只存我們需要的數(shù)據(jù),如標(biāo)識(shí)字段或靜態(tài)數(shù)據(jù)頻繁被使用,因此,它們可以保存在會(huì)話狀態(tài)中。現(xiàn)在網(wǎng)上有很多關(guān)于介紹ASP.NET這三種狀態(tài)的文章,如果讀者想更進(jìn)一步發(fā)覺(jué)它們的潛力,可以閱讀相關(guān)的資料。每一種狀態(tài)都應(yīng)該被使用在適合它們的地方。因此,花時(shí)間學(xué)習(xí)和理解它們是非常必要的。
在這里我想給讀者介紹另外一種狀態(tài),視圖狀態(tài),這種狀態(tài)將會(huì)影響客戶端程序。這種狀態(tài)被用來(lái)在aspx頁(yè)中保存數(shù)據(jù),或是在服務(wù)端和客戶端之間傳遞數(shù)據(jù)。在默認(rèn)情況下,視圖狀態(tài)對(duì)于ASP.NET和控件是開(kāi)啟的。但我們的Web頁(yè)并不是都需要視圖狀態(tài)。如果都開(kāi)啟,在Web頁(yè)中將會(huì)有非常多的數(shù)據(jù)保存在視圖狀態(tài)中。解決這個(gè)問(wèn)題的一個(gè)正確方法就是使用“View Source"來(lái)控制我們的Web頁(yè)哪塊數(shù)據(jù)需要被存儲(chǔ)。我們可以看看ASP.NET發(fā)送客戶端的數(shù)據(jù),在頁(yè)的上端一大塊被加密的數(shù)據(jù)就是視圖狀態(tài)。花一些時(shí)間來(lái)確定哪些數(shù)據(jù)需要視圖狀態(tài)的值得的。如果某些Web頁(yè)和服務(wù)端沒(méi)有任何數(shù)據(jù)交互,可以將這些頁(yè)的視圖狀態(tài)關(guān)閉。視圖狀態(tài)很靈活,它可以關(guān)閉整個(gè)頁(yè),也可以只關(guān)閉被個(gè)用戶控件,或是只打開(kāi)某些控件的視圖狀態(tài)。如果我們關(guān)閉某個(gè)頁(yè)面或控件的視圖狀態(tài),其它的頁(yè)面或控件可以保證正確的工作狀態(tài)。
4. 清除不需要的CSS和腳本文件
一個(gè)快速和容易的改善我們的應(yīng)用程序性能的方法就是清楚我們程序中的不需要的CSS和腳本文件。有時(shí)我們的程序中存在很多舊的CSS,而且在開(kāi)發(fā)程序時(shí),在不斷完善系統(tǒng)的過(guò)程中,可能會(huì)遺留很多沒(méi)用的腳本文件或腳本程序。需要網(wǎng)站使用了一個(gè)單獨(dú)的CSS或腳本文件來(lái)滿足整個(gè)網(wǎng)站的需要。這樣做將會(huì)產(chǎn)生大量的數(shù)據(jù)和代碼冗余。有時(shí),只要簡(jiǎn)單地清楚這些文件,就可以通過(guò)改變Web頁(yè)的大小的方式來(lái)改善我們網(wǎng)站的性能。如果我們?cè)诰W(wǎng)站的代碼中繼續(xù)引用不再使用的CSS或腳本文件,那么在每次加載網(wǎng)頁(yè)時(shí)它們都會(huì)進(jìn)行被傳輸,這樣將是對(duì)網(wǎng)絡(luò)資源的一種浪費(fèi)。我們可以通過(guò)運(yùn)行一個(gè)Web頁(yè)分析器來(lái)準(zhǔn)確地知道哪個(gè)頁(yè)被轉(zhuǎn)載,哪個(gè)頁(yè)裝載的時(shí)間最長(zhǎng)。
5. 裝載測(cè)試和Visual Studio Team系統(tǒng)
裝載測(cè)試從本質(zhì)上說(shuō)是發(fā)現(xiàn)系統(tǒng)的性能問(wèn)題,并測(cè)量系統(tǒng)在單位時(shí)間內(nèi)的響應(yīng)次數(shù)。Visual Studio Team系統(tǒng)(VSTS)包括了一個(gè)強(qiáng)大的簡(jiǎn)單的工具,用來(lái)對(duì)Web程序進(jìn)行裝載測(cè)試,并提供更有價(jià)值的報(bào)告。使用測(cè)試模板可以非常簡(jiǎn)單地按著系統(tǒng)所提示的步驟建立一個(gè)測(cè)試工程。我們可建立一個(gè)或多個(gè)Web測(cè)試,并為每一個(gè)Web測(cè)試配置相應(yīng)的屬性來(lái)模擬不同的用戶。
通過(guò)使用VSTS提供的Web頁(yè)記錄器,可以紀(jì)錄我們?yōu)榱私eb測(cè)試而在我們的網(wǎng)站中執(zhí)行的一系列步驟。Web測(cè)試通過(guò)模擬的用戶進(jìn)行測(cè)試,這將作為裝載測(cè)試的一部分。我們還可以使用性能監(jiān)視器在我們的服務(wù)器上安裝性能計(jì)數(shù)器。使用性能計(jì)數(shù)器監(jiān)測(cè)我們的Web服務(wù)器上發(fā)生的一些特殊活動(dòng)數(shù)據(jù),如私有字節(jié)、虛擬字節(jié)以及CPU使用率等。如果我們?cè)趹?yīng)用程序中有內(nèi)存漏洞,那么我們很容易通過(guò)監(jiān)視內(nèi)存來(lái)發(fā)現(xiàn)這些漏洞。我們所得到的結(jié)果將以來(lái)于應(yīng)用程序裝載什么而有細(xì)微的差別,但是我們的Web服務(wù)器的內(nèi)存應(yīng)該達(dá)到一個(gè)一致的水平,并保持穩(wěn)定。圖1顯示了一個(gè)VSTS裝載測(cè)試的例子。
6、總結(jié)
上面所提到的五個(gè)用于改善Web性能的方法非常快捷,并不需要更多的開(kāi)發(fā)經(jīng)驗(yàn)和工作技巧。然而,如果我們決定采用這些步驟來(lái)處理我們的Web應(yīng)用程序時(shí),請(qǐng)對(duì)它們做一個(gè)仔細(xì)的分析,并研究每一個(gè)方面以便做出個(gè)正確的決定來(lái)如何優(yōu)化。最好的方法是在進(jìn)行開(kāi)發(fā)之前做一個(gè)詳盡的結(jié)構(gòu)圖和計(jì)劃書(shū)。最后希望讀者可以從本文找到用于改善自己的Web程序性能有用的方法。
1. 適當(dāng)?shù)靥幚頂?shù)據(jù)訪問(wèn)對(duì)象
如果我們沒(méi)有正確處理數(shù)據(jù)訪問(wèn)對(duì)象,就會(huì)大量消耗我們的服務(wù)器內(nèi)存。當(dāng)建立一個(gè)數(shù)據(jù)訪問(wèn)對(duì)象時(shí),充分理解它們的生命周期以及不需要它們時(shí)如何處置是非常必要的。我經(jīng)常看到很多開(kāi)發(fā)人員建立、打開(kāi)和銷毀DataReader對(duì)象,但卻不對(duì)它做任何處理。如果能確保我們的數(shù)據(jù)訪問(wèn)對(duì)象適當(dāng)?shù)乇还芾?#xff0c;這將在很大程度上解決IIS為什么直接機(jī)器快崩潰時(shí)才釋放內(nèi)存的另人頭痛的問(wèn)題。就先讓我們?cè)诮鉀Q方案中查找關(guān)于DataReader實(shí)例吧,對(duì)于發(fā)現(xiàn)的每一個(gè)DataReader實(shí)例,請(qǐng)確保它們已經(jīng)被關(guān)閉或是被釋放。建議使用try/catch/finally塊來(lái)處理。如下面代碼所示:
using (IDataReader reader = MySite.GetSearchResults())
{
//Consume the datareader
while (reader.Read())
{
//Do something with the data
}
)
使用try/catch/finally 塊
IDataReader reader;
try
{
reader = MyWeb.GetSearchResults();
while (reader.Read())
{
//Do something with the data
}
}
catch (Exception ex)
{
//Log the exception
}
finally
{
//如果這個(gè)對(duì)象存在,dispose這個(gè)對(duì)象
if (reader != null)
reader.Dispose();
}
2. 管理IIS應(yīng)用程序池
在典型的應(yīng)用中,當(dāng)處理一個(gè)Web應(yīng)用程序時(shí),這個(gè)Web程序由多個(gè)部分組成。通常有我們的主Web站點(diǎn),一個(gè)或多個(gè)Web服務(wù),或是一個(gè)圖象處理程序。IIS6為我們提供了為多個(gè)應(yīng)用程序建立程序池的機(jī)會(huì)。應(yīng)用程序池允許我們使應(yīng)用程序在各自的單獨(dú)進(jìn)程中運(yùn)行。這么做的好處是將我們的應(yīng)用程序的不同組成部分分開(kāi),使它們分別運(yùn)行在自己的內(nèi)存空間中。由于每個(gè)處理進(jìn)程的內(nèi)存達(dá)到800-900M時(shí)系統(tǒng)就會(huì)變得很慢,因此,需要應(yīng)用程序分散到不同的處理進(jìn)程中,這樣每個(gè)工作進(jìn)程占有的內(nèi)存就不會(huì)那么大了。這樣會(huì)從某種程度上提高系統(tǒng)運(yùn)行的效率。關(guān)于如果建立應(yīng)用程序池的問(wèn)題,請(qǐng)參閱微軟的相關(guān)技術(shù)文檔。
3. 管理ASP.NET狀態(tài)
為了更進(jìn)一步地改善應(yīng)用程序性能,對(duì)ASP.NET的不同的狀態(tài)類型有一個(gè)深入的了解是非常必要的。ASP.Net有許多不同的狀態(tài),但是我們應(yīng)該弄清楚什么是應(yīng)用程序狀態(tài)、會(huì)話狀態(tài)和profile屬性。因?yàn)檫@些狀態(tài)都保存在服務(wù)器的內(nèi)存上。所有應(yīng)盡量避免保存太多這三種狀態(tài)的數(shù)據(jù),除非有必要保存它們。如果我們需要在會(huì)話狀態(tài)保存數(shù)據(jù),就只存我們需要的數(shù)據(jù),如標(biāo)識(shí)字段或靜態(tài)數(shù)據(jù)頻繁被使用,因此,它們可以保存在會(huì)話狀態(tài)中。現(xiàn)在網(wǎng)上有很多關(guān)于介紹ASP.NET這三種狀態(tài)的文章,如果讀者想更進(jìn)一步發(fā)覺(jué)它們的潛力,可以閱讀相關(guān)的資料。每一種狀態(tài)都應(yīng)該被使用在適合它們的地方。因此,花時(shí)間學(xué)習(xí)和理解它們是非常必要的。
在這里我想給讀者介紹另外一種狀態(tài),視圖狀態(tài),這種狀態(tài)將會(huì)影響客戶端程序。這種狀態(tài)被用來(lái)在aspx頁(yè)中保存數(shù)據(jù),或是在服務(wù)端和客戶端之間傳遞數(shù)據(jù)。在默認(rèn)情況下,視圖狀態(tài)對(duì)于ASP.NET和控件是開(kāi)啟的。但我們的Web頁(yè)并不是都需要視圖狀態(tài)。如果都開(kāi)啟,在Web頁(yè)中將會(huì)有非常多的數(shù)據(jù)保存在視圖狀態(tài)中。解決這個(gè)問(wèn)題的一個(gè)正確方法就是使用“View Source"來(lái)控制我們的Web頁(yè)哪塊數(shù)據(jù)需要被存儲(chǔ)。我們可以看看ASP.NET發(fā)送客戶端的數(shù)據(jù),在頁(yè)的上端一大塊被加密的數(shù)據(jù)就是視圖狀態(tài)。花一些時(shí)間來(lái)確定哪些數(shù)據(jù)需要視圖狀態(tài)的值得的。如果某些Web頁(yè)和服務(wù)端沒(méi)有任何數(shù)據(jù)交互,可以將這些頁(yè)的視圖狀態(tài)關(guān)閉。視圖狀態(tài)很靈活,它可以關(guān)閉整個(gè)頁(yè),也可以只關(guān)閉被個(gè)用戶控件,或是只打開(kāi)某些控件的視圖狀態(tài)。如果我們關(guān)閉某個(gè)頁(yè)面或控件的視圖狀態(tài),其它的頁(yè)面或控件可以保證正確的工作狀態(tài)。
4. 清除不需要的CSS和腳本文件
一個(gè)快速和容易的改善我們的應(yīng)用程序性能的方法就是清楚我們程序中的不需要的CSS和腳本文件。有時(shí)我們的程序中存在很多舊的CSS,而且在開(kāi)發(fā)程序時(shí),在不斷完善系統(tǒng)的過(guò)程中,可能會(huì)遺留很多沒(méi)用的腳本文件或腳本程序。需要網(wǎng)站使用了一個(gè)單獨(dú)的CSS或腳本文件來(lái)滿足整個(gè)網(wǎng)站的需要。這樣做將會(huì)產(chǎn)生大量的數(shù)據(jù)和代碼冗余。有時(shí),只要簡(jiǎn)單地清楚這些文件,就可以通過(guò)改變Web頁(yè)的大小的方式來(lái)改善我們網(wǎng)站的性能。如果我們?cè)诰W(wǎng)站的代碼中繼續(xù)引用不再使用的CSS或腳本文件,那么在每次加載網(wǎng)頁(yè)時(shí)它們都會(huì)進(jìn)行被傳輸,這樣將是對(duì)網(wǎng)絡(luò)資源的一種浪費(fèi)。我們可以通過(guò)運(yùn)行一個(gè)Web頁(yè)分析器來(lái)準(zhǔn)確地知道哪個(gè)頁(yè)被轉(zhuǎn)載,哪個(gè)頁(yè)裝載的時(shí)間最長(zhǎng)。
5. 裝載測(cè)試和Visual Studio Team系統(tǒng)
裝載測(cè)試從本質(zhì)上說(shuō)是發(fā)現(xiàn)系統(tǒng)的性能問(wèn)題,并測(cè)量系統(tǒng)在單位時(shí)間內(nèi)的響應(yīng)次數(shù)。Visual Studio Team系統(tǒng)(VSTS)包括了一個(gè)強(qiáng)大的簡(jiǎn)單的工具,用來(lái)對(duì)Web程序進(jìn)行裝載測(cè)試,并提供更有價(jià)值的報(bào)告。使用測(cè)試模板可以非常簡(jiǎn)單地按著系統(tǒng)所提示的步驟建立一個(gè)測(cè)試工程。我們可建立一個(gè)或多個(gè)Web測(cè)試,并為每一個(gè)Web測(cè)試配置相應(yīng)的屬性來(lái)模擬不同的用戶。
通過(guò)使用VSTS提供的Web頁(yè)記錄器,可以紀(jì)錄我們?yōu)榱私eb測(cè)試而在我們的網(wǎng)站中執(zhí)行的一系列步驟。Web測(cè)試通過(guò)模擬的用戶進(jìn)行測(cè)試,這將作為裝載測(cè)試的一部分。我們還可以使用性能監(jiān)視器在我們的服務(wù)器上安裝性能計(jì)數(shù)器。使用性能計(jì)數(shù)器監(jiān)測(cè)我們的Web服務(wù)器上發(fā)生的一些特殊活動(dòng)數(shù)據(jù),如私有字節(jié)、虛擬字節(jié)以及CPU使用率等。如果我們?cè)趹?yīng)用程序中有內(nèi)存漏洞,那么我們很容易通過(guò)監(jiān)視內(nèi)存來(lái)發(fā)現(xiàn)這些漏洞。我們所得到的結(jié)果將以來(lái)于應(yīng)用程序裝載什么而有細(xì)微的差別,但是我們的Web服務(wù)器的內(nèi)存應(yīng)該達(dá)到一個(gè)一致的水平,并保持穩(wěn)定。圖1顯示了一個(gè)VSTS裝載測(cè)試的例子。
6、總結(jié)
上面所提到的五個(gè)用于改善Web性能的方法非常快捷,并不需要更多的開(kāi)發(fā)經(jīng)驗(yàn)和工作技巧。然而,如果我們決定采用這些步驟來(lái)處理我們的Web應(yīng)用程序時(shí),請(qǐng)對(duì)它們做一個(gè)仔細(xì)的分析,并研究每一個(gè)方面以便做出個(gè)正確的決定來(lái)如何優(yōu)化。最好的方法是在進(jìn)行開(kāi)發(fā)之前做一個(gè)詳盡的結(jié)構(gòu)圖和計(jì)劃書(shū)。最后希望讀者可以從本文找到用于改善自己的Web程序性能有用的方法。
轉(zhuǎn)載于:https://www.cnblogs.com/yangxiao/articles/986680.html
總結(jié)
以上是生活随笔為你收集整理的改善ASP.NET2.0性能的五件法宝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JS判断数字字母中文
- 下一篇: 通过反射动态调用webservices