2010-11-19 75 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