捕获没有网络延迟的ASP.Net服务器执行时间

时间:2010-11-19 17:18:12

标签: asp.net page-lifecycle

我需要捕获ASP.net在我的应用程序中执行每个页面请求所花费的时间,但我需要排除任何网络延迟。我目前正在捕获渲染时间,方法是使用StopWatch类并在页面生命周期的OnInit方法期间启动秒表,并在Unload方法完成后停止它。似乎Unload方法包括将请求发送到客户端所花费的时间,因此包括任何互联网/网络延迟。我可以在页面生命周期中停止秒表的最后一点是什么,其中不包括将请求发送到客户端所需的时间。它会直接在卸载事件之前吗?

相关问题:ASP.net在开始发送给客户端之前是否完成了响应?或者它是否开始异步发送,而响应正在形成?

我目前正在使用带有IIS 5的ASP.Net 2.0。

我在所有网页都继承自的类中都有此代码:

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);
}

更新

我尝试在OnRender方法结束时,在OnUnload方法的开头和OnUnload方法的末尾捕获执行时间。在所有三种情况下,时间差异最多为1毫秒。即使从欧洲的客户端到美国的服务器进行测试,时间也是相同的。所以我认为我在这里遗漏了一些东西。

3 个答案:

答案 0 :(得分:1)

如果Response.BufferOutput设置为true,则.Net将等待页面处理完成,然后再将html发送回客户端。

如果它是假的,那么.Net会尽快开始发回数据。

Response.Flush通常会刷新缓冲区。

我看到测试网站性能而忽略延迟的最好方法是让请求机器与服务器在同一网段上。通常插入相同的路由器/交换机。此时,您将延迟下降得足够远,以至于它只是计算的一小部分。请注意,您不希望直接在服务器上进行测试,因为这会导致处理时间被拆分以运行您的客户端。

更新(来自评论)
这比评论要长一点。

乔恩,你确定你还没有把延迟作为一个因素消除吗?为了检测它,您必须确保在运行每个测试之前清除本地Web缓存和DNS缓存。如果所有这些都被缓存并且剩余的数据量非常小,那么它在服务器所在的位置上并没有太大差别。假设页面的不可缓存部分只有4KB。在页面速度方面,您不会注意到2MB连接与ISDN线路之间存在很大差异。

您可以查看this question以了解如何测试各种延迟级别。我知道您希望消除所有延迟作为一个因素,但您可能会考虑从不同的角度对此进行攻击。即,检查高延迟和低延迟连接之间的差异。这应该会给你相当多的信息,以便从你真正想要的价值中计算出那些时间。

答案 1 :(得分:0)

启用ASP.NET跟踪:http://msdn.microsoft.com/en-us/library/ms972204.aspx 它显示了每个方法和整个页面的执行时间。

答案 2 :(得分:0)

IIS日志文件具有处理请求所花费的时间。这将包括调用.Net所需的任何时间,你的方法不会记录。