繁体   English   中英

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

[英]How can I measure the response and loading time of a webpage?

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

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

附加信息:

我不能使用商业应用程序,我需要开发它以便能够将结果保存到数据库并基于此信息创建一系列报告。

webrequest 解决方案似乎是我将要使用的方法,但是,能够测量完全加载页面(图像、css、javascript 等)所需的时间会很好。 知道怎么做吗?

如果只想记录获取基本页面源代码需要多长时间,可以将 HttpWebRequest 包裹在秒表周围。 例如

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;

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

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

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

衡量这种事情很棘手,因为 Web 浏览器在下载所有网页元素(JS、CSS、图像、iframe 等)时有一些特殊性——这种特殊性在这本优秀的书( http://www. amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/ )。

自制的解决方案可能太复杂而无法编码,或者无法满足其中一些特殊性(衡量下载 html 所花费的时间还不够好)。

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

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

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

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

像这样的事情可能会正常工作:

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;

我曾经写过一个实验程序,用于下载 HTML 页面及其引用的对象(图像、iframe 等)。

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

我经常遇到一个非常相似的问题。 但是我采取了稍微不同的方法:首先,我为什么要关心静态内容? 我的意思是当然这对用户很重要,如果图像需要 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 之前,我会尝试阅读有关连接性和用户意见的信息...

tl;博士

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

长版

我遇到了您遇到的相同挑战,因此我创建了一个副项目来测量实际加载时间。 它使用 Node 和 Nightmare 来操作无头(“隐形”)Web 浏览器。 加载所有资源后,它会报告完全加载页面所需的毫秒数。

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

这是我们的后端输入 NIXStats 后的结果值的屏幕截图: 在此处输入图片说明

用法示例:

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

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

您可以使用以下软件:

http://www.cyscape.com/products/bhawk/page-load-time.aspx

http://www.trafficflowseo.com/2008/10/website-load-timer-great-to-monitor.html

Google 将有助于找到最适合您需求的产品。

如果您使用 firefox,请安装在http://getfirebug.com 上找到的 firebug 扩展。 从那里,选择 net 选项卡,它会让您知道页面上所有内容的加载/响应时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM