【发布时间】:2011-02-27 17:54:33
【问题描述】:
我目前正在测量从 C# 程序加载网页所花费的时间。
Visual Studio 解决方案有一个控制台程序和一个只有一页的 ASP.NET 网站。该网站托管在 ASP.NET 开发服务器上。控制台应用程序像这样查询网页:
bool isSuccess;
Stopwatch timeSpentToDownloadPage = Stopwatch.StartNew();
WebRequest request = HttpWebRequest.Create(new Uri("http://localhost:12345/Test.aspx", UriKind.Absolute));
request.Timeout = 200;
using (WebResponse response = request.GetResponse())
{
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream);
string responseText = sr.ReadToEnd().Trim();
isSuccess = (responseText == "Hello World");
}
timeSpentToDownloadPage.Stop();
网页没有什么特别之处,只是加载响应,没有 ASP.NET 代码:
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Hello World");
}
现在,秒表显示代码每次花费 0 毫秒。完成所有工作(查询服务器、获取响应等)。
这怎么可能?我在做的事情没有问题吗?真的,我预计至少需要 10-20 毫秒。执行所有客户端代码,然后是 100 毫秒。到:
- [客户端]从uri中找到要查询的页面(不需要DNS查询,所以很快),
- [客户端] 执行请求,
- [服务器端] 初始化 ASP.NET 引擎,
- [服务器端]处理请求,
- [服务器端]查找并读取.aspx文件并执行编译后的代码(至少读取文件可能会花费数毫秒),
- [服务器端]构建响应,包括标头,然后发送,
- [客户端] 接收响应并处理它(修剪)。
那么为什么它如此之快?是否有一个棘手的缓存只是跳过所有/大部分步骤并将“Hello World”返回给客户端?
如果有“隐藏”缓存,它在哪里?如何禁用它以衡量“实际”花费的时间?
【问题讨论】:
-
您如何检查秒表返回值?您是否正在检查 ElapsedMilliseconds 属性?您总是可以在代码中休眠以测试它是否正常工作。仅仅因为它在本地主机上并不意味着它可以调用页面,等待它被渲染并在不到 1 毫秒的时间内检查响应。
标签: c# asp.net performance caching asp.net-development-serv