2009-04-24 82 views
5

我需要建立一个Windows窗体应用程序来衡量它需要完全加载网页的时候,有什么是应该做的是最好的方法?如何测量网页的响应和加载时间?

这个小应用程序的目的是监测网站的一些页面,在预定的时间间隔,为了能够事先知道如果事情是与Web服务器或数据库服务器会错。

附加信息:

我不能使用商业应用程序,我需要为了能够将结果保存到数据库,并创建了一系列基于此信息报告制定本。

webrequest解决方案似乎是我要使用的方法,但是,能够测量完全加载页面所需的时间(图像,CSS,JavaScript等) 。任何想法如何做到这一点?

回答

16

如果你只是想记录它需要多久才能获得基本的网页源代码,你可以用一个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; 

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

[编辑]作为对此的替换方案,则可以使用该web浏览器控件和测量时间从击发执行.Navigate()和DocumentCompleted事件之间。我认为这还包括额外内容的下载和渲染时间。不过,我没有使用WebBrowser控件一个巨大的数额,只不知道,如果你要清除高速缓存,如果你反复请求相同的页面。

+1

+1 - 我很奇怪的这个想法很舒服 - 大声笑 – 2009-04-24 21:38:28

+0

伟大的思想认为一样:) – 2009-04-24 21:40:06

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; 
0

如果你使用Firefox安装在http://getfirebug.com发现Firebug扩展。从那里,选择净选项卡,它会让你知道页面上所有内容的加载/响应时间。

3

根据您所需要的频率如何做到这一点,也许你可以尝试使用Selenium(用于Web应用程序的自动化测试工具),因为它的用户内部网络浏览器,你将有一个相当接近的措施。我认为从.Net应用程序使用Selenium API不会太困难(因为您甚至可以在单元测试中使用Selenium)。

测量这种东西是棘手的,因为当下载所有网页元素(JS,CSS,图像,iframe等)时,网页浏览器具有一些特殊性 - 这种特殊性在这本精彩的书中解释(http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/) 。

一个自制的解决方案可能会太复杂的代码或将无法参加这些特殊性(测量下载HTML所花费的时间不够好)。

2

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

也要注意服务器端的缓存。假设你在上午9点下载速度,需要15秒,那么你在9点5分下载它需要3秒,最后在10点再次需要15秒。

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

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

1

我写一次实验program这将下载一个HTML页面它引用的对象(图像,I帧等)。

比看起来更复杂,因为有HTTP协商,因此,一些Web客户端将获得SVG版本的图像和一些PNG,尺寸大不相同。 <object>同样的事情。

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我得到通知,我可以采取行动。

随着萤火虫,我们知道一个网站加载所有内容(开发阶段)的“正常”性能。通过基准测试,我们获得了当前的服务器状况(即使是在我们的手机上)。好。接下来是什么?我们必须确保所有/大部分访问者获得良好的联系。我觉得这部分非常困难,并且乐于接受建议。不过,我尝试使用日志文件并ping几个IP,以查看访问此网络需要多长时间。另外,在我决定使用特定的ISP之前,我会尝试阅读有关连接和用户的意见......