使用简洁的 Navigation Timing API 测试网页加载速度(不完全译文)

本文探讨了如何利用NavigationTimingAPI精确测量网页加载速度,包括关键事件的时间戳和页面加载方式。介绍了如何实时获取真实用户的页面加载速度和性能统计方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址:http://www.cnblogs.com/mrsunny/archive/2012/09/04/2670727.html

我们总希望网页加载的快一点。谷歌实验显示短如100毫秒的延迟就会对用户体验造成不好的影响。那么我们如何来测量网页加载速度?"page load"的真实含义又是什么?

Navigation Timing 是一个可以在web中精确测量性能的javascript API。这个API提供了一个简单的方法来获得页面导航、加载事件的精确而又详细的时间状态。目前在 IE9ChromeFirefox nightly builds 中可用。

这篇文章描述了 Navigation API 并展示了如何使用API导出时间数据。

使用方法:

在Chrome中打开控制台,在命令行中输入performance,点开并查看它的timing属性,你会看到如下代码:

image

如果在IE中使用,需要使用<!doctype html>文档声明,浏览器需要在标准模式下。

各属性代表的意义:

每一个performance.timing属性都表示一个页面事件(例如页面发送了请求)或者页面加载(例如当DOM开始加载),测量以毫秒的形式从1970年1月1日的午夜开始。结果为0表示该事件未发生(例如redirectEnd或者redirectStart等)。

这些事件所代表的含义在Microsoft's performance.timing documentation 和 更加正式的 W3C Editor's Draft 中都有描述。IE9支持除了secureConnectionStart时间外在API草案中描述的所有属性,并且IE9额外提供了msFirstPaint事件,该事件在dcoument display开始,在loadEventEnd之后触发。

这里有一张从 Navigation Timing draft 弄来的 performance.timing 事件的顺序图:

navigationStart

当load/unload动作被触发时,也可能是提示关闭当前文档时(即回车键在url地址栏中按下,页面被再次刷新,submit按钮被点击)。如果当前窗口中没有前一个文档,那么navigationStart的值就是fetchStart。 

redirectStart

它可能是页面重定向时的开始时间(如果存在重定向的话)或者是0

unloadEventStart:

如果被请求的文档来自于前一个同源(同源策略)的文档,那么该属性存储的是浏览器开始卸载前一个文档的时刻。否则的话(前一个文档非同源或者没有前一个文档),为0。

unloadEventEnd:

表示同源的前一个文档卸载完成的时刻。如果前一个文档不存在或者非同源,则为0。

redirectEnd

如果存在重定向的话,redirectEnd表示最后一次重定向后服务器端response的数据被接收完毕的时间否则的话就是0。

fetchStart

fetchStart是指在浏览器发起任何请求之前的时间值。在fetchStart和domainLookupStart之间,浏览器会检查当前文档的缓存。

domainLookupStart

这个属性是指当浏览器开始检查当前域名的DNS之前的那一时刻。如果因为任何原因没有去检查DNS(即浏览器使用了缓存,持久连接,或者本地资源),那么它的值等同于fetchStart。

domainLookupEnd

指浏览器完成DNS检查时的时间。如果DNS没有被检查,那么它的值等同于fetchStart。

connectStart

当浏览器开始于服务器连接时的时间。如果资源取自缓存(或者服务器由于其他任何原因没有建立连接,例如持久连接),那么它的值等同于domainLookupEnd。

connectEnd

当浏览器端完成与服务器端建立连接的时刻。如果没有建立连接它的值等同于domainLookupEnd。

secureConnectionStart

可选。如果页面使用HTTPS,它的值是安全连接握手之前的时刻。如果该属性不可用,则返回undefined。如果该属性可用,但没有使用HTTPS,则返回0。

responseStart

指客户端收到从服务器端(或缓存、本地资源)响应回的第一个字节的数据的时刻。

responseEnd

指客户端收到从服务器端(或缓存、本地资源)响应回的最后一个字节的数据的时刻。

domLoading

指document对象创建完成的时刻。

domInteractive

指文档解析完成的时刻,包括在“传统模式”下被阻塞的通过script标签加载的内容(除了使用defer或者async属性异步加载的情况)。

domContentLoadedEventStart

当DOMContentLoaded事件触发之前,浏览器完成所有script(包括设置了defer属性但未设置async属性的script)的下载和解析之后的时刻。

domContentLoadedEventEnd

当DOMContentLoaded事件完成之后的时刻。它也是javascript类库中DOMready事件触发的时刻。

domComplete

如果已经没有任何延迟加载的事件(所有图片的加载)阻止load事件发生,那么该时刻将会将document.readyState属性设置为"complete",此时刻就是domComplete。

loadEventStart

该属性返回的是load事件刚刚发生的时刻,如果load事件还没有发生,则返回0。

loadEventEnd

该属性返回load事件完成之后的时刻。如果load事件未发生,则返回0。

检测用户通过哪种方式来到此页面:

我们有几种方式来打开一个页面,例如,在地址栏输入url,刷新当前页面,通过history的前进后退。这时候 performance.navigation 就派上用场了。这个 API 有两个属性:

  • redirectCount:页面请求被重定向的次数
  • type:页面被载入的方式。

以下列举了 type 属性的三种取值情况:

  • 0:用户通过点击链接或者在浏览器地址栏输入URL的方式进入页面。
  • 1:页面重载。
  • 2:通过浏览器history的前进或后退进入页面。

eg: 你通过的方式进入页面。

实时页面性能测试:

通过 Navigation Timing API ,我们可以精确实时的获取真实用户的在实际网络环境中的页面加载速度,而不是仅仅在开发环境、公司网络中测试页面加载速度。

页面性能统计:

我们甚至可以使用 XHR 将用户每次浏览网页时的 performance.timing 数据发送到服务器端。这种方式是实时的,不过效率比较低。或者,可以使用本地存储的方式将用户页面性能的数据存储在本地并周期性的打包发送到服务器端进行分析。通过这种方式,navigation timing API 实现了一种简单的提供页面性能历史数据的方法。

附录:

1. 2012.03.01: Kasia 写了一个非常不错数据可视化的书签

2. 另外一个Chrome插件

image

 

 

源文档来自:http://www.html5rocks.com/en/tutorials/webperformance/basics/ 。

参考:


### 使用Monkey工具进行Navigation Timing性能测试 Monkey工具是一种Android平台上的压力测试工具,主要用于模拟用户操作行为以测试应用的稳定性和性能。然而,Monkey工具本身并直接支持Navigation Timing相关的性能测试Navigation Timing API主要用于Web浏览器环境,用于测量网页加载性能的时间指标[^3]。 在Android环境中,可以通过结合Monkey工具和WebView中的Navigation Timing API来实现对网页加载性能的测试。以下是具体方法及案例: #### 方法概述 1. **Monkey工具的基本功能**:Monkey工具可以生成伪随机的用户事件流(如点击、触摸、手势等),并将其发送到设备或模拟器上。这些事件可以触发WebView中网页的加载。 2. **WebView与Navigation Timing API**:在Android应用中,如果使用了WebView加载网页,则可以通过JavaScript接口访问Navigation Timing API,获取详细的网页加载时间数据。 #### 实现步骤 以下是一个结合Monkey工具和Navigation Timing API的示例代码: ```java // 通过JavaScript接口获取Navigation Timing数据 public class NavigationTimingActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_navigation_timing); webView = findViewById(R.id.webView); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); // 添加JavaScript接口 webView.addJavascriptInterface(new WebAppInterface(), "HTMLOUT"); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 在页面加载完成后执行JavaScript代码 webView.loadUrl("javascript:window.HTMLOUT.sendTimingData(window.performance.timing);"); } }); // 加载目标网页 webView.loadUrl("https://example.com"); } // JavaScript接口类 public class WebAppInterface { @JavascriptInterface public void sendTimingData(String timingData) { try { JSONObject jsonObject = new JSONObject(timingData); long navigationStart = jsonObject.getLong("navigationStart"); long responseStart = jsonObject.getLong("responseStart"); long domContentLoadedEventEnd = jsonObject.getLong("domContentLoadedEventEnd"); // 计算关键性能指标 long ttfb = responseStart - navigationStart; // Time To First Byte long domReadyTime = domContentLoadedEventEnd - navigationStart; // DOM Ready Time Log.d("Performance", "TTFB: " + ttfb + "ms, DOM Ready Time: " + domReadyTime + "ms"); } catch (JSONException e) { e.printStackTrace(); } } } } ``` #### Monkey命令示例 在上述代码运行后,可以通过Monkey工具生成随机事件来模拟用户操作,从而触发同页面的加载。以下是一个简单的Monkey命令示例: ```bash adb shell monkey -p com.example.navigationtimingtest --throttle 500 -v 500 ``` - `-p com.example.navigationtimingtest`:指定目标应用包名。 - `--throttle 500`:设置事件之间的延迟为500毫秒。 - `-v 500`:生成500个随机事件,并输出详细日志。 #### 数据分析 通过上述方法,可以在Monkey工具的压力测试过程中实时捕获Navigation Timing数据,并记录关键性能指标(如TTFB、DOM Ready Time等)。这些数据可以帮助开发者分析网页加载性能瓶颈。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值