【问题标题】:How can I measure the response and loading time of a webpage?如何测量网页的响应和加载时间?
【发布时间】:2009-04-24 21:21:22
【问题描述】:

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

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

其他信息:

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

webrequest 解决方案似乎是我将要使用的方法,但是,如果能够测量完全加载页面(图像、css、javascript 等)所需的时间,那就太好了。知道如何做到这一点吗?

【问题讨论】:

    标签: c# winforms monitoring


    【解决方案1】:

    如果您只想记录获取基本页面源所需的时间,您可以将 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 控件,只是不知道如果您重复请求同一页面,是否必须清除缓存。

    【讨论】:

    • 我也是!我可能会在我的代码中使用它,我猜额外内容的测量将很难精确实现。
    • 这很好,但如果在本地使用,结果将不现实。
    • 这种方法会导致非常不完整的结果
    • 如果您尝试迭代使用它,请确保使用 response.Close();在迭代之间,否则你会得到超时。
    • 6 年后仍然有用 Craig T. ! :) 感谢分享这种方法。很有帮助。
    【解决方案2】:

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

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

    自制的解决方案可能编码起来过于复杂,或者无法考虑其中的一些特殊性(测量下载 html 所花费的时间还不够好)。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        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;
        

        【讨论】:

          【解决方案5】:

          我曾经写过一个实验性program,它下载了一个HTML页面它引用的对象(图像、iframe等)。

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              【讨论】:

                【解决方案8】:

                【讨论】:

                  【解决方案9】:

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

                  【讨论】:

                    【解决方案10】:

                    tl;博士

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

                    加长版

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

                    对您有用的一个很好的功能是它会重复加载网页并将结果提供给第三方服务。我将这些值输入 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

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2021-10-12
                      • 2011-02-18
                      • 2017-11-22
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多