聊聊 PerformanceObserver
背景
历史
1. 扩展了 Performance 接口的基本定义
2. 在 Web Workers 中暴露了 PerformanceEntry
3. 增加了 PerformanceObserver 的支持
正文
1. 避免不知道性能事件啥时候会发生,须要重复轮询 timeline 获取记录。
2. 避免产生重复的逻辑去获取不一样的性能数据指标。
3. 避免其余资源需要操作浏览器性能缓冲区时产生竞态关系。
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
只有定义没有例子的文章不是一篇合格的技术文,接下来我们就通过示例来了解下 PerformanceObserver 方法的具体用法。
const entryHandler = (list) => {
for (const entry of list.getEntries()) {
if (entry.name === 'first-paint') {
observer.disconnect()
}
console.log(entry)
}
}
const observer = new PerformanceObserver(entryHandler)
observer.observe({ type: 'paint', buffered: true })
通过以上代码可以得到 FP 的内容:
const entryHandler = (list) => {
for (const entry of list.getEntries()) {
if (entry.name === 'first-contentful-paint') {
observer.disconnect()
}
console.log(entry)
}
}
const observer = new PerformanceObserver(entryHandler)
observer.observe({ type: 'paint', buffered: true })
通过以上代码可以得到 FCP 的内容:
const entryHandler = (list) => {
if (observer) {
observer.disconnect()
}
for (const entry of list.getEntries()) {
console.log(entry)
}
}
const observer = new PerformanceObserver(entryHandler)
observer.observe({ type: 'largest-contentful-paint\', buffered: true })
通过以上代码可以得到 LCP 的内容:
let cls = 0;
const entryHandler = (list) => {
for (const entry of list.getEntries()) {
if (!entry.hadRecentInput) {
cls += entry.value;
console.log('Current CLS value:', cls, entry);
}
}
};
const observer = new PerformanceObserver(entryHandler);
observer.observe({type: 'layout-shift', buffered: true});
通过以上代码得到 CLS 的值,如下:
const entryHandler = (list) => {
for (const entry of list.getEntries()) {
const delay = entry.processingStart - entry.startTime;
console.log('FID :', delay, entry);
}
};
const observer = new PerformanceObserver(entryHandler);
observer.observe({type: 'first-input', buffered: true});
通过运行上方代码可以得到当前页面 FID 的值:
3.6 兼容性
3.7 MutationObserver
const next = window.requestAnimationFrame ? requestAnimationFrame : setTimeout
['STYLE', 'SCRIPT', 'LINK'] =
observer = new MutationObserver(mutationList => {
const entry = {
children: [],
}
for (const mutation of mutationList) {
if (mutation.addedNodes.length && isInScreen(mutation.target)) {
...
}
}
if (entry.children.length) {
entries.push(entry)
> { =
performance.now() =
})
}
})
{
childList: true,
subtree: true,
})
具体思路大致如下
总结
本文分享自微信公众号 - 58技术(architects_58)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开发者实战 | 如何应用 Anomalib 在数据集不平衡的情况下检测缺陷?-下篇
文章作者: Paula Ramos,英特尔 AI 软件布道师,美国 武卓,英特尔 AI 软件布道师,中国 Samet Akcay,英特尔人工智能研究工程师/科学家 在上篇文章《开发者实战 |如何应用Anomalib在数据集不平衡的情况下检测缺陷?-上篇》中,我们介绍了深度学习异常检测库 Anomalib(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib)。简而言之,当您想进行自动缺陷检测,但数据集不平衡时,Anomalib 是一个很好的工具。 希望您已经通过入门 notebook (复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/tree/main/notebooks/000_getting_started)访问并亲自试用了这个开源项目。如果没有,请不要担心,这篇博文将教您如何结合自己的数据集使用 Anomalib。 在这个示例中,我们将介绍一个令人振奋的 Dobot 机器人工业用例,其中的机械臂用于教育、工业和智能用例中。如果您没有可用的 Dobot 机器人,您可以简单地...
- 下一篇
StampedLock:JDK1.8中新增,比ReadWriteLock还快的锁
摘要:StampedLock是一种在读取共享变量的过程中,允许后面的一个线程获取写锁对共享变量进行写操作,使用乐观读避免数据不一致的问题,并且在读多写少的高并发环境下,比ReadWriteLock更快的一种锁。 本文分享自华为云社区《一文彻底理解并发编程中非常重要的票据锁——StampedLock》,作者:冰 河 。 什么是StampedLock? ReadWriteLock锁允许多个线程同时读取共享变量,但是在读取共享变量的时候,不允许另外的线程多共享变量进行写操作,更多的适合于读多写少的环境中。那么,在读多写少的环境中,有没有一种比ReadWriteLock更快的锁呢? 答案当然是有!那就是我们今天要介绍的主角——JDK1.8中新增的StampedLock!没错,就是它! StampedLock与ReadWriteLock相比,在读的过程中也允许后面的一个线程获取写锁对共享变量进行写操作,为了避免读取的数据不一致,使用StampedLock读取共享变量时,需要对共享变量进行是否有写入的检验操作,并且这种读是一种乐观读。 总之,StampedLock是一种在读取共享变量的过程中,允许...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19