You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<imgid="image0"src="https://www.w3.org/Icons/w3c_main.png"/><script>functioninit(){// see [[USER-TIMING-2]]performance.mark("startWork");setTimeout(()=>{performance.mark("endWork");measurePerf();},2000);}functionmeasurePerf(){performance.getEntries().map(entry=>JSON.stringify(entry,null,2)).forEach(json=>console.log(json));}
引入了一个 外部图片, mark 可以理解为标记了一个时间点 getEntries 得到所有的性能数据,最后输出。
具体结果可看:
window.onload: default, it is fired when the entire page loads , including its content (images, CSS, scripts, etc.) In some browsers it now takes over the role of document.onload and fires when the DOM is ready as well.
constdoTask=(ms)=>newPromise((resolve,reject)=>{setTimeout(()=>{resolve()},ms);})asyncfunctionrun(){performance.mark("startTask1");awaitdoTask(1000);// Some developer codeperformance.mark("endTask1");performance.mark("startTask2");awaitdoTask(2000);// Some developer codeperformance.mark("endTask2");// Log them outconstentries=performance.getEntriesByType("mark");for(constentryofentries){console.table(entry.toJSON());}}run();
分别得到四个点的时间。
measure
用于在两个 **点 (即上文提到的打点) ** 之间测量时间
举个 例子:需要测量一个 for 循环花费的时间。
介绍
Performance timeline ,w3c 有两个版本的规范,本文基于 第二版本 介绍。
工欲善其事,必先利其器。要想使页面更快,那么准确测量出性能数据也是很重要的。
那么我们来看一下,在一个web页面的生命周期之内,我们基于
Performance Timeline
可以得到哪些性能指标。主要分为以下三大类:
举个🌰, w3c 上的例子,我稍加改造 :
引入了一个 外部图片,
mark
可以理解为标记了一个时间点getEntries
得到所有的性能数据,最后输出。具体结果可看:
由此我就得到了页面上,当时的所有性能指标,包括
navigation
,resource
,FP
,FCP
...等一些自定义的指标。ps:
FP
:页面上第一个像素落点的时候FCP
: 页面上开始有内容绘制的时候现在我想要过滤一下只要我自己 mark 的点,可采用:
getEntriesByType(mark)
,只想要页面绘制相关的 fp,fcp,采用
getEntriesByName('first-paint')
。but,我们得到的就只是当时得到的性能指标,假如后面又有 图片请求了呢,又有 js 请求了呢 🤣🤣。
我们要一直 轮询我们的
measurePerf
吗?当然有新的解决方式。
PerformanceObserver
PerformanceObserver,是浏览器内部对Performance实现的观察者模式,即: 当有性能数据产生时,主动通知你。
这解决了我们之前的问题:
监测页面FP,FCP
现在可以:
关于
entryTypes
, 可以取如下值:关于
entry
:每个事件类型的 entry 对象都不一样。
navigation
entry 对象里能拿到相关的数据有这里完整地描述了一个
页面
呈现的完整流程。拿到每个时间点可以进行分析每个区间的时间耗费。
ps
关于
dom
几个重要的时间点:domInteractive :
网页DOM结构结束解析、开始加载内嵌资源时,即Document.readyState属性变为“interactive”。domComplete
:当前文档解析完成,即Document.readyState 变为 'complete'。domContentLoadedEventStart
: 触发当前 文档的domContentLoadedEvent
的时候domContentLoadedEventEnd
: 在 当前文档的domContentLoadedEvent
完成之后发生document.redayState
: 的状态,其他:
window.onload:
default, it is fired when the entire page loads , including its content (images, CSS, scripts, etc.) In some browsers it now takes over the role of document.onload and fires when the DOM is ready as well.resource
entry 对象里能拿到相关的数据有这里道理和上面的
navigation
一样。mark
这里打了四个点,用来标识两个任务的开始时间和结束时间,两个任务分别采用
Promise
推迟执行。doTask
模拟推迟行为。分别得到四个点的时间。
measure
用于在两个 **点 (即上文提到的打点) ** 之间测量时间
举个 例子:需要测量一个
for
循环花费的时间。longtask
这个 支持度 好像不高,chrome 亲测可以。
可以检测 应用里 任何在浏览器中执行超过 50 ms 的任务。
原因来源还比较多:
比如上面得 实例, 我们仅需加入一个需要的检测 的
entryType
既可。可以看到,Performance timeline 第二版本,相对以前还是有很大改进的,我们也有了更多的手段得到想要监控的数据。
EOF。
最后
如果喜欢本篇文章,可以关注的微信公众号,如果不嫌烦,还可以把它添加到桌面😀。
The text was updated successfully, but these errors were encountered: