原貼地址:http://blog.csdn.net/sfeig/archive/2005/08/25/464846.aspx
原貼標題: 一個不起眼的問題導致效能的嚴重的下降
從昨天下午到今天一直在尋找一個很重要的問題,原因是從objectDataSource控制項的資料緩衝失效查起,導致了網站的效能下降,沒想到花了一天的工夫最後查出的原因讓人跌破眼鏡。
有經驗的美工喜歡用<img src="" width="1" height="3">這種方式來精確的控制換行的高度,因為這樣可以通過控制<img>的height來實現像素級的換行高度控制,然而這樣做對伺服器來說卻是一個不折不扣的考驗和折磨。
當使用者請求訪問某個頁面時,瀏覽器將首先擷取該頁面的原始碼,然後執行,在執行的過程中,將會在記憶體中建立該頁面對象執行個體,載入各種資源,激發各種相應的用戶端事件,執行對應的javaScript指令碼,直到最後展現給我們一個精美的頁面。
如果將圖片的src設為空白,瀏覽器會將該圖片的連結地址設定為網站的地址,如:http://localhost/myWebsites,這一點我們可以通過按右鍵圖片屬性查看url地址得到證實,這時候,瀏覽器將會按照此地址向伺服器請求該圖片的實際內容位元組流,以便顯示該圖片,可是按照此地址向伺服器請求時,將會執行網站的預設首頁面,就像我們請求訪問了該首頁面一樣,伺服器將會執行首頁面的所有生命週期內的相關代碼,然後返回用戶端該首頁面的產生位元組流,由於該圖片位元組流實際上是一個頁面的原始碼,所以瀏覽器將不能正確的顯示該圖片。
到這裡我們也看得很清楚了,當使用者請求訪問含有<img src="">頁面時,將會導致了伺服器額外的執行網站首頁面,相當於我們同時訪問了當前頁面和網站首頁面兩個頁面。伺服器會將這兩個頁面內容位元組流返回用戶端,不但浪費了伺服器的資源,還白白消耗了寶貴的網路頻寬。如果您的系統是多層架構的話,同樣將會影響到每一層伺服器的效能。
為了驗證這裡的結論,我們不妨做兩個頁面:
Page1.htm
<html>
<body>
this is the default page.
</body>
</html>
Page2.htm
<html>
<body>
<img src="" width=500 height=100><br>
this is the user requested page.
</body>
</html>
在IIS中將page1.htm設為首頁面,分兩次訪問page2.htm:
第一次:訪問page2.htm頁面,並將該頁面儲存。
第二次:刪除page2.htm頁面代碼中的<img src="" width=500 height=100>,儲存該頁面代碼,然後再訪問此頁面,並儲存該頁面;
結論驗證:
伺服器端驗證:
這一點我們可以通過查看IIS服務日誌來確認,預設的IIS日誌地址為:C:/WINDOWS/system32/LogFiles/w3svc1,開啟該檔案夾,可以看到以日期命名的文字檔,格式如:ex050825.log,開啟該檔案可以看到我們剛才的訪問請求記錄,如下: #Date: 2005-08-25 01:47:14
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status
2005-08-25 01:47:14 127.0.0.1 GET /MasterPageAndDefaultRelationStudy/page2.htm - 80 - 127.0.0.1 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2;+Maxthon;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50215;+.NET+CLR+1.0.3705) 200 0 0
2005-08-25 01:47:14 127.0.0.1 GET /MasterPageAndDefaultRelationStudy/page1.htm - 80 - 127.0.0.1 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2;+Maxthon;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50215;+.NET+CLR+1.0.3705) 200 0 0
2005-08-25 01:47:22 127.0.0.1 GET /MasterPageAndDefaultRelationStudy/page2.htm - 80 - 127.0.0.1 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2;+Maxthon;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50215;+.NET+CLR+1.0.3705) 304 0 0
很明顯,我們在第一次訪問page2.htm頁面時,IIS同時向用戶端還返回了網站的預設首頁面,page1.htm,然而在我們第二次訪問page2.htm頁面時,伺服器並沒有返回page1.htm頁面。
用戶端驗證:
瀏覽到我們剛才分別兩次儲存頁面的地方看看,對於第一次儲存的頁面,同時還產生了一個同名的檔案夾,裡面存放的就是以網站名稱命名的*.htm頁面,其實就是剛才的page1.htm頁面;而對於我們第二次儲存的頁面,並沒有產生同名的檔案夾。
上面的只是一個樣本性質的驗證,我們可以寫一個更複雜的含有執行代碼的驗證執行個體,同時可以啟動斷點調試功能,這樣就能看得更清楚了。
所以最後的結論是:在我們的頁面中千萬不能含有<img src="">這樣的代碼,這同樣也包括用戶端的javascript指令碼的動作行為,如建立一個img元素,而將其src設為空白等。