如何衡量网页的响应和加载时间?

时间:2009-04-24 21:21:22

标签: c# winforms monitoring

我需要构建一个Windows窗体应用程序来测量完全加载网页所需的时间,这样做的最佳方法是什么?

这个小应用程序的目的是以预定的时间间隔监视网站中的某些页面,以便能够事先知道Web服务器或数据库服务器是否出现问题。

其他信息:

我无法使用商业应用,我需要开发此功能,以便能够将结果保存到数据库并根据此信息创建一系列报告。

webrequest解决方案似乎是我正在使用的方法,但是,能够测量完全加载页面所需的时间(图像,css,javascript等)会很好。知道如何做到这一点?

10 个答案:

答案 0 :(得分:20)

如果您只想记录获取基本页面源所需的时间,可以围绕秒表包装HttpWebRequest。 E.g。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);

System.Diagnostics.Stopwatch timer = new Stopwatch();
timer.Start();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

timer.Stop();

TimeSpan timeTaken = timer.Elapsed;

但是,这不会考虑下载额外内容的时间,例如图片。

[edit]作为替代方案,您可以使用WebBrowser控件并测量从触发执行.Navigate()和DocumentCompleted事件之间的时间。我认为这还将包括额外内容的下载和渲染时间。但是,我没有大量使用WebBrowser控件,只是在您反复请求同一页面时才知道是否必须清除缓存。

答案 1 :(得分:4)

根据您需要的频率,也许您可​​以尝试使用Selenium(一种用于Web应用程序的自动化测试工具),因为用户在内部使用Web浏览器,您将有一个非常接近的衡量标准。我认为从.Net应用程序中使用Selenium API并不太困难(因为你甚至可以在单元测试中使用Selenium)。

测量这种东西很棘手,因为Web浏览器在下载所有网页元素(JS,CSS,图像,iframe等)时都有一些特殊性 - 这种特殊性在这本优秀的书中得到了解释({{3 }})。

自制解决方案可能过于复杂而无法编码或无法参与其中某些特性(测量下载html所花费的时间不够好)。

答案 2 :(得分:2)

您需要考虑的一件事是缓存。确保您正在测量从服务器而不是从缓存中下载的时间。您需要确保已关闭客户端缓存。

还要注意服务器端缓存。假设您在上午9:00下载速度并且需要15秒,然后您在9:05下载它需要3秒,最后在10:00再次需要15秒。

可能发生的是,在9处,服务器必须完全呈现页面,因为缓存中没有任何内容。在9:05,页面位于缓存中,因此不需要再次渲染它。最后是10,缓存已被清除,因此页面需要再次由服务器呈现。

我强烈建议你查看FireFox的YSlow插件,它会详细分析下载页面上每个项目的时间。

答案 3 :(得分:1)

这样的事可能会很好:

System.Diagnostics.Stopwatch sw = new Stopwatch()
System.Net.HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.example.com");
// other request details, credentials, proxy settings, etc...

sw.Start();
System.Net.HttpWebResponse res = (HttpWebResponse)req.GetResponse();
sw.Stop();

TimeSpan timeToLoad = sw.Elapsed;

答案 4 :(得分:1)

我曾写过一次实验性 program,它会下载HTML页面它引用的对象(图片,iframe等)。

比看起来更复杂,因为有HTTP协商,所以,一些Web客户端将获得图像的SVG版本和一些PNG版本,大小差异很大。 <object>也是如此。

答案 5 :(得分:1)

我经常遇到一个非常相似的问题。但是我采取了一种略微不同的方法:首先,我为什么要关心静态内容呢?我的意思当然对于用户来说很重要,如果图像需要2分钟或2秒,但在我完全开发页面之后这不是我的问题。这些问题在开发时和部署后都存在问题,这不是静态内容,而是通常会减慢速度的动态内容(就像你在上一段中所说的那样)。接下来就是,你为什么相信这么多东西保持不变?如果您的网络上的某个人启动了一个p2p程序,那么路由出错或者您的ISP遇到了一些问题,您的服务器统计信息肯定会崩溃。您的基准测试对于生活在全球的用户或仅使用不同的ISP的用户说了些什么?我只是说,你是对你的观点进行基准测试,但这并没有说明服务器的性能,是吗?

为什么不让网站/服务器本身确定加载所需的时间?这是一个用PHP编写的小例子:

function microtime_float()
{
  list($usec, $sec) = explode(" ", microtime());
  return ((float)$usec + (float)$sec);
}

function benchmark($finish)
{
  if($finish == FALSE){  /* benchmark start*/    
    $GLOBALS["time_start"] = microtime_float();
  }else{ /* benchmark end */    
    $time = microtime_float() - $GLOBALS["time_start"]; 
    echo '<div id="performance"><p>'.$time.'</p></div>';
  }
}

它在页面的末尾添加了构建时间(用css隐藏)。每隔几分钟我用正则表达式对此进行grep并解析它。如果这个时间到了,我知道有什么不对(包括静态内容!),并通过RSS-Feed我得到通知,我可以采取行动。

使用firebug,我们知道加载所有内容(开发阶段)的网站的“正常”性能。通过基准测试,我们得到了当前的服务器情况(甚至在我们的手机上)。好。接下来是什么?我们必须确保所有/大多数访客都能获得良好的联系。我发现这部分非常困难,并且愿意接受建议。但是,我尝试获取日志文件并ping几个IP,以查看到达此网络所需的时间。此外,在我决定使用特定ISP之前,我尝试阅读有关连接和用户意见的内容......

答案 6 :(得分:0)

答案 7 :(得分:0)

答案 8 :(得分:0)

如果你正在使用firefox安装在http://getfirebug.com找到的firebug扩展名。从那里,选择网络标签,它会让你知道页面上所有内容的加载/响应时间。

答案 9 :(得分:0)

tl; dr

使用无头浏览器测量加载时间。 Website Loading Time是这样做的一个例子。

长版

我遇到了与您同样遇到的挑战,因此我创建了一个副项目来衡量实际加载时间。它使用Node和Nightmare操纵无头(“不可见”)Web浏览器。加载所有资源后,它将报告完全加载页面所花费的毫秒数。

一个对您有用的不错的功能是它可以重复加载网页并将结果提供给第三方服务。我将这些值输入NIXStats进行报告;您应该能够修改代码以将值输入到您自己的数据库中。

下面是我们将后端的结果值输入NIXStats的屏幕截图: enter image description here

用法示例:

website-loading-time rinogo$ node website-loading-time.js https://google.com
1657
967
1179
1005
1084
1076
...

此外,如果您的代码大部分必须使用C#,您仍然可以利用此脚本/库。由于它是一个命令行工具,因此您可以从C#代码中调用它并处理结果。

https://github.com/rinogo/website-loading-time

披露:我是这个项目的作者。