2011-11-21 100 views
12

我正在使用dotTrace Performance 4.5來分析.NET 3.5 C#Web應用程序。當我記錄一個「用戶請求」(頁面加載)時,我看到11個線程的時間大約相同,爲7644毫秒。C#Web應用程序優化:PerformWaitCallback

  • 大多數線程描述只包含: 100%[本地或優化的代碼 - 7644毫秒
  • 一個人說: 100%Microsoft.VisualStudio.WebServer.WebServerApp.Main(String[])
  • 最後一曰:
    • 86%System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object)
    • 14%PerformWaitCallback(1094ms)>> 12%= ProcessRequest

你能告訴我:

  • 爲什麼有這麼多線程? (圖片資源,AJAX,JavaScript)
  • 什麼是PerformWaitCallback
  • 爲什麼7644毫秒只有1094毫秒的工作?
+1

你只測量一個*請求嗎?你應該啓動應用程序並運行*多個*請求;啓動Web應用程序涉及固有的開銷。 – casperOne

+0

我在分析一個請求之前「加熱」應用程序。如果我運行多個請求(N x 8秒),我會得到類似的結果。 –

+1

可能取決於您使用的是IIS,IIS Express還是Web Development Server。 –

回答

1

關於PerformWaitCallback,這是引用來源有說:

回撥幫手。該功能將請求分派給 用戶回調。工作項目從循環中的每個應用程序域 隊列中提取,直到沒有更多工作或者量子已經過期爲止。量子被強制保持 之間的公平性。

您可以看到完整的代碼here

順便說一句,我不知道,如果你看到這個.NET 4.5 - 從參考源再次(找不到一個在線版本,你就必須從http://referencesource.microsoft.com/下載):

//This type is necessary because VS 2010's debugger looks for a method named 
///_ThreadPoolWaitCallbacck.PerformWaitCallback 
//on the stack to determine if a thread is a ThreadPool thread or not. 
//We have a better way to do this for .NET 4.5, but 
//still need to maintain compatibility with VS 2010. 
//When compat with VS 2010 is no longer an issue, this type may be removed. 
internal static class _ThreadPoolWaitCallback 
{ 
    [System.Security.SecurityCritical] 
    static internal bool PerformWaitCallback() 
    { 
     return ThreadPoolWorkQueue.Dispatch(); 
    } 
} 
3

爲什麼會有這麼多的線程? (圖片資源,AJAX,JavaScript)

Web服務器創建一個線程池來管理傳入請求,並且池中有多個線程。

什麼是PerformWaitCallback?

不知道是肯定的,但它看起來像等待一個線程池線程完成其任務的代碼。

爲什麼7644毫秒只有1094毫秒的工作?

它看起來像分析器正在計算一些線程正在等待新工作的時間。我沒有使用dotTrace,但大多數分析器都有一種方法來配置它們,以便他們可以確定線程在等待還是在工作 - 基於您發佈的信息,我懷疑探查器配置不正確。

+0

對不起,我遲到的答案,但我正在解決的性能問題。如果我使用DotTrace監視IIS,則沒有更多'PerformWaitCallback',但具有相同時差的'System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr,Int32)'... –