我需要测量页面完全加载所需的总时间,从单击菜单按钮到完全渲染。我通过使用BeginRequest
和EndRequest
事件做到了这一点。因为有些数字太大,我开始测量加载时页面执行的每个方法和事件的时间。使用秒表我计时Preinit
,Init
,Load
等,页面生命周期中的所有事件以及我创建的所有其他方法。令我惊讶的是,添加这些数字我甚至没有接近使用开始/结束请求的数字。最后一个甚至是双倍,三倍,例如7秒,与我从每个事件/方法得到的2秒相比。
所以我想知道,这个额外的时间是从哪里来的?在我的调试窗口中显示的时间之间,我可以看到所有类型的“加载jhfggdfaasdf.dll”,可能是一些临时文件。这个dll加载可以花这个时间吗?
我注意到,我的时间不时匹配,所以也许有一些缓存机制,但我需要一些更有经验的人的确认。
答案 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页面会告诉您各种服务器事件的时间,并且可以很容易地看到您的速度。
如果页面仍然需要很长时间才能呈现,则存在客户端方面的注意事项,例如
这可以使用客户端工具(如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();
}
这将为您提供仅执行该方法所需的时间。