2010-11-19 72 views
2

我需要捕獲ASP.net在我的應用程序中執行每個頁面請求所需的時間量,但我需要排除任何網絡延遲。我目前通過使用StopWatch類捕獲渲染時間,並在頁生命週期的OnInit方法期間啓動秒錶,並在Unload方法完成後停止它。看來,卸載方法包括將請求發送到客戶端所需的時間,因此包括任何互聯網/網絡延遲。我可以在頁面生命週期中停止秒錶的最後一個可能點是什麼,它不包括將請求發送到客戶端所需的時間。它會直接在Unload事件之前嗎?捕獲ASP.Net服務器執行時間沒有網絡延遲

相關問題:ASP.net在開始發送給客戶端之前是否完成響應?還是它開始異步發送,而響應正在形成?

我目前使用ASP.Net 2.0與IIS 5。

我有這樣的代碼在一個類中,所有我的網頁繼承:

readonly Stopwatch _serverExecutionTime = new Stopwatch(); 

protected override void OnInit(EventArgs e) 
{ 
    _serverExecutionTime.Start(); 
    base.OnInit(e); 
}  

protected override void OnUnload(EventArgs e) 
{ 
    _serverExecutionTime.Stop(); 
    base.OnUnload(e); 
} 

UPDATE

我試圖在的OnRender方法結束拍攝的執行時間,在開始的OnUnload方法和OnUnload方法的末尾。在所有三種情況下,時間差異最多爲1毫秒。即使從歐洲的客戶到美國的服務器進行測試,時間也是一樣的。所以我認爲我在這裏錯過了一些東西。

回答

1

如果Response.BufferOutput設置爲true,那麼.Net將等待,直到頁面處理完成,然後再將html發送回客戶端。

如果它是錯誤的,那麼.Net開始儘快發送數據。

Response.Flush通常會沖洗緩衝區。

我所看到的用於測試網站性能而忽略延遲的最佳方式是讓機器在與服務器相同的網段上發出請求。通常插入相同的路由器/交換機。在這一點上,你將會把延遲下降得足夠遠,以至於它只是計算的一小部分。請注意,您不希望直接在服務器上進行測試,因爲這會導致處理時間被拆分以運行客戶端。

更新(來自評論)
這比評論稍長。

喬恩,你確定你還沒有消除延遲作爲一個因素?爲了檢測它,你必須確保你的本地網頁緩存和DNS緩存在運行每個測試之前被清除。如果所有這些都被緩存了,並且剩餘的數據量非常小,那麼在服務器所在的位置上它並沒有太大的區別。假設頁面的非緩存部分僅爲4KB。在頁面速度方面,您不會注意到2MB連接與ISDN線路之間的差異。

您可能會檢查this question以瞭解如何測試各種延遲級別。我知道你想消除所有延遲作爲一個因素,但你可能會考慮從不同的角度來攻擊。即,檢查高延遲和低延遲連接之間的差異。這應該給你一個相當數量的信息,以便從你真正想要的值中分解出這些時間。

+0

我同意在同一網段上提出請求。但就我的代碼示例而言,捕獲base.OnUnload之前的最佳時間是什麼? – Jon 2010-11-19 18:54:17

+0

@Jon:我會在卸載事件的開始或渲染事件結束時進行測試。 – NotMe 2010-11-19 20:16:57

+0

我試圖捕獲卸載事件之前和之後的值。即使在美國和英國的服務器上,這兩次都幾乎一樣。最多的時間是1毫秒。不幸的是,這並不能幫助我。你還有其他建議嗎? – Jon 2010-11-22 14:11:43

0

只需打開ASP.NET跟蹤:http://msdn.microsoft.com/en-us/library/ms972204.aspx 它顯示每個方法和整個頁面的執行時間。

+0

我知道我可以使用跟蹤,但我需要物理地捕獲我的生產站點的執行時間。我會將它們記錄到數據庫中。我無法在我的生產環境中使用跟蹤。 – Jon 2010-11-19 20:00:42

0

IIS日誌文件有處理請求的時間。這將包括調用.Net所需的任何時間,您的方法不會記錄。

+0

謝謝,但我實際上想排除一部分時間。我想消除所有可能的網絡延遲。 – Jon 2010-11-19 21:07:46