2011-08-31 122 views
1

我需要測量頁面完全加載所需的總時間,從點擊菜單按鈕到完全呈現。我這樣做,通過使用BeginRequestEndRequest事件。由於有些數字太大,我開始測量加載時執行頁面的每個方法和事件的時間。使用秒錶我計時Preinit,Init,Load等,頁面生命週期中的所有事件加上我創建的所有其他方法。我驚訝的是,添加這些數字我甚至沒有接近使用begin/end請求的數字。最後一個甚至是兩倍,三倍,例如7秒,與我從每個事件/方法得到的2秒相比。ASP.NET頁面加載時間問題

所以我想知道,這額外的時間從哪裏來?在我的調試窗口中顯示的時間之間,我可以看到各種「加載jhfggdfaasdf.dll」,可能是一些臨時文件。這次可以加載這個DLL嗎?

我注意到時不時,我的時間匹配,所以也許有一些緩存機制,但我需要一些更有經驗的人確認。

+0

如果您發佈了一些實際的數字,它可能會有所幫助。 – Justin

+0

此頁面上的延遲是否一致,還是僅在第一次加載時發生? –

回答

2

編輯:從再次閱讀您的問題,您可能會使用asp.net網站解決方案類型。這是不是預編譯時,你正在調試,並且你第一次請求一個頁面,它編譯成你的asp.net目錄中的類。然後將該類的dll加載到應用程序域中,使用一個有趣的名稱,例如您提到的名稱。這種情況發生在您第一次請求其中一個頁面時,並且您想要部署時,您可以預編譯您的站點以提高性能。

如果您看到「加載xyz.dll」,則表示應用程序域正在加載應用程序使用的內容。當您需要運行尚未加載到應用程序域的所需dll(在您的情況下可能是第三方庫)中的代碼時,會發生這種情況。這很好,因爲它意味着一個使用庫的頁面,但從未被調用過,從未將該程序集加載到內存中。您可以通過在應用程序啓動時將您的bin中的所有程序集加載到應用程序域中,將此命中從第一頁請求移至應用程序加載。這是在使用內存和請求速度之間進行折衷。這個問題開始與一個好去處:

How to pre-load all deployed assemblies for an AppDomain

您可以通過在asp.net使用跟蹤功能讓你的頁面生命週期時間一個很好的概述。

http://msdn.microsoft.com/en-us/library/94c55d08.aspx

查看的trace.axd頁面會告訴你時間過的各種服務器事件,使它很容易看到你在哪裏:這可以在web.config文件這篇文章中所描述的設置慢。

如果頁面仍然需要很長的時間來呈現,也有客戶端的考慮,如

  • 是你的頁面非常大
  • 你所有的HTML之前解釋JavaScript和CSS編寫
  • 是你的網絡很慢
  • 你發送了很多css和js文件嗎?大多數瀏覽器限制了併發資源下載的數量。也許可以考慮將幾個css文件合併爲一個,在您的生產環境中至少使用
  • 您正在使用客戶端緩存。你可以告訴瀏覽器緩存一段時間。如果您的內容需要更新,有許多方法可以使此緩存無效。

這可以使用客戶端工具(如firebug或chrome中的開發人員工具)進行調試。

+0

請讓我知道如果這有幫助,如果它不是答案,這將是很好的知道爲什麼:) –

+0

事實上,該網站使用了很多的DLL。大約有50個以及大量的JavaScript和CSS文件。我將調查是否有任何JavaScript導致任何瓶頸。幸運的是,這並不經常發生,大部分時間速度都很好。就像,一個客戶的一個大的持續時間,然後一切都恢復正常,就像一個高峯。所以我正在考慮,這種情況發生在IIS重置,回收或類似或臨時性網絡問題之後。開始/結束請求是否也計算將頁面發送到客戶端瀏覽器所需的時間? – Nial

+0

是的,開始和結束請求事件是在服務器上完成的,所以客戶端仍然在等待,但這些事件真的非常快。你所描述的內容聽起來像是在及時編譯,所以也許你應該看看預編譯你的網站。如果它不是一個DLL加載的東西,那麼跟蹤將幫助您縮小搜索範圍,以查看慢代碼的位置。 –

0

秒錶本身實際上是一個相當麻煩的對象。您可能實際上是通過使用它來記錄時間來加載加載時間。一個稍微有效的方法是使用簡單的日期時間比較。

protected void Pre_Init(object sender, EventArgs e) 
    DateTime started = DateTime.Now; 

    // .... some code 

    lblDisplayComment.Text = DateTime.Now.Subtract(started).TotalMilliseconds.ToString(); 
} 

這會給你以毫秒爲單位執行該方法的時間。