ASP.NET页面加载时间问题

时间:2011-08-31 12:50:36

标签: asp.net lifecycle

我需要测量页面完全加载所需的总时间,从单击菜单按钮到完全渲染。我通过使用BeginRequestEndRequest事件做到了这一点。因为有些数字太大,我开始测量加载时页面执行的每个方法和事件的时间。使用秒表我计时PreinitInitLoad等,页面生命周期中的所有事件以及我创建的所有其他方法。令我惊讶的是,添加这些数字我甚至没有接近使用开始/结束请求的数字。最后一个甚至是双倍,三倍,例如7秒,与我从每个事件/方法得到的2秒相比。

所以我想知道,这个额外的时间是从哪里来的?在我的调试窗口中显示的时间之间,我可以看到所有类型的“加载jhfggdfaasdf.dll”,可能是一些临时文件。这个dll加载可以花这个时间吗?

我注意到,我的时间不时匹配,所以也许有一些缓存机制,但我需要一些更有经验的人的确认。

2 个答案:

答案 0 :(得分:2)

编辑:再次阅读您的问题,您可能正在使用asp.net网站解决方案类型。在调试时,这不是预编译的,并且第一次请求页面时,它会将其编译为asp.net目录中的类。然后将类的dll加载到app域中,其名称与您提到的名称一样有趣。这是在您第一次请求其中一个页面时发生的,当您要部署时,您可以预先编译您的站点以提高性能。

如果您看到“正在加载xyz.dll”,则表示应用程序域正在加载应用程序使用的内容。当您需要从尚未加载到应用程序域的所需dll(在您的情况下可能是第三方库)中运行代码时,会发生这种情况。这很好,因为它意味着一个使用库但从未被调用过的页面,从不将该程序集加载到内存中。您可以通过在应用程序启动时将bin中的所有程序集预加载到应用程序域中,将此命中从第一页请求移动到应用程序加载。这是在使用内存与请求速度之间的权衡。这个问题是一个很好的开始:

How to pre-load all deployed assemblies for an AppDomain

通过使用asp.net中的跟踪功能,您可以很好地了解页面生命周期时间。这可以在web.config文件中设置,如本文所述:

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

查看trace.axd页面会告诉您各种服务器事件的时间,并且可以很容易地看到您的速度。

如果页面仍然需要很长时间才能呈现,则存在客户端方面的注意事项,例如

  • 是您的页面非常大
  • 你是在编写所有html和css之前解释javascript吗
  • 是你的网络慢
  • 你发送了很多css和js文件吗?大多数浏览器限制并发资源下载的数量。也许可以考虑在生产环境中至少将一些css文件合并为一个
  • 您使用的是客户端缓存吗?你可以告诉浏览器在一段时间内缓存一些东西。如果您的内容需要更新,有很多方法可以使此缓存无效。

这可以使用客户端工具(如firebug或chrome中的开发人员工具)进行调试。

答案 1 :(得分:0)

秒表本身实际上是一个相当麻烦的对象。实际上,您可以通过使用它来记录时间来增加加载时间。一种稍微更有效的方法是使用简单的日期时间比较。

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

    // .... some code

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

这将为您提供仅执行该方法所需的时间。