当前位置: 首页 > article >正文

前端性能优化指标 - DCL - 计算 DCL 时间(使用 JavaScript、使用 Chrome DevTools)

计算 DCL 时间

测试代码
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>dcl</title>

		<script>
			// 模拟一个耗时的 JavaScript 任务(阻塞 2 秒)
			const start = Date.now();
			while (Date.now() - start < 2000) {}
		</script>
	</head>

	<body>
		<p>测试 DCL</p>
	</body>
</html>
1、使用 JavaScript
  1. 使用 performance.timing 计算 DCL 时间
document.addEventListener("DOMContentLoaded", function () {
    const dclTime = performance.timing.domContentLoadedEventStart - performance.timing.navigationStart;
    console.log("DCL Time:", dclTime, "ms");
});
  1. 使用 PerformanceNavigationTiming 计算 DCL 时间
document.addEventListener("DOMContentLoaded", function () {
    const timing = performance.getEntriesByType("navigation")[0];
    if (timing && timing.domContentLoadedEventStart > 0) {
        const dclTime = timing.domContentLoadedEventStart - timing.startTime;
        console.log("DCL Time:", dclTime, "ms");
    } else {
        console.log("PerformanceNavigationTiming is not supported or values are invalid.");
    }
});
2、使用 Chrome DevTools
  1. 打开 Chrome DevTools(F12),切换到 Performance 面板
  1. 点击 Reload 按钮录制页面加载过程
  1. 在 Timings 部分查看 DCL 时间

学习补充

1、performance.timing
(1)基本介绍
  1. performance.timing 是一个 PerformanceTiming 对象

  2. PerformanceTiming 是 Navigation Timing API 的一部分

  3. PerformanceTiming 用于提供页面加载过程中各个关键时间点的详细信息,用于帮助开发者分析和优化页面加载性能

(2)关键属性
属性说明
navigationStart页面导航开始的时间(通常是点击链接或输入 URL 的时间)
loadEventStartload 事件开始的时间
loadEventEndload 事件结束的时间
domLoading浏览器开始解析 HTML 文档的时间
domInteractive浏览器完成 HTML 解析并构建 DOM 树的时间
domComplete页面加载完成的时间(包括所有资源加载完成)
domContentLoadedEventStartDOMContentLoaded 事件开始的时间
domContentLoadedEventEndDOMContentLoaded 事件结束的时间
(3)基本使用
  1. 计算页面加载总时间
  • 注:这里不能将代码放直接放在 load 事件中,否则,performance.timing.loadEventEnd 的值可能为 0,因为 load 事件尚未完全完成
window.addEventListener("load", function () {
    setTimeout(function () {
        const loadTime = performance.timing.loadEventEnd - performance.timing.navigationStart;
        console.log("Page Load Time:", loadTime, "ms");
    }, 0);
});
  1. 计算 DOM 解析时间
window.addEventListener("load", function () {
    const domParseTime = performance.timing.domComplete - performance.timing.domLoading;
    console.log("DOM Parse Time:", domParseTime, "ms");
});
  1. 计算 DCL 时间
document.addEventListener("DOMContentLoaded", function () {
    const dclTime = performance.timing.domContentLoadedEventStart - performance.timing.navigationStart;
    console.log("DCL Time:", dclTime, "ms");
});
(4)performance.timing 的局限性
  1. performance.timing 是旧版 Navigation Timing API 的一部分,在现代浏览器中已被 PerformanceNavigationTiming 取代

  2. performance.timing 在大多数现代浏览器中仍然可用,但在未来的浏览器版本中可能会被移除

  3. 建议使用 PerformanceNavigationTiming 替代 performance.timing

2、PerformanceNavigationTiming
(1)基本介绍
  • PerformanceNavigationTiming 是现代浏览器中替代 performance.timing 的 API,它提供了更详细和准确的性能数据
(2)关键属性
属性说明
startTime导航开始的时间
domContentLoadedEventStartDOMContentLoaded 事件开始的时间
domContentLoadedEventEndDOMContentLoaded 事件结束的时间
loadEventStartload 事件开始的时间
loadEventEndload 事件结束的时间
(3)基本使用
  1. 计算页面加载总时间
  • 注:这里不能将代码放直接放在 load 事件中,否则,timing.loadEventEnd 的值可能为 0,因为 load 事件尚未完全完成
window.addEventListener("load", function () {
    const timing = performance.getEntriesByType("navigation")[0];
    setTimeout(function () {
        const loadTime = timing.loadEventEnd - timing.startTime;
        console.log("Page Load Time:", loadTime, "ms");
    }, 0);
});
  1. 计算 DCL 时间
document.addEventListener("DOMContentLoaded", function () {
    const timing = performance.getEntriesByType("navigation")[0];
    if (timing && timing.domContentLoadedEventStart > 0) {
        const dclTime = timing.domContentLoadedEventStart - timing.startTime;
        console.log("DCL Time:", dclTime, "ms");
    } else {
        console.log("PerformanceNavigationTiming is not supported or values are invalid.");
    }
});

http://www.kler.cn/a/522034.html

相关文章:

  • 实验七 带函数查询和综合查询(2)
  • OpenCV:形态学操作总结
  • QT+mysql+python 效果:
  • 微服务(一)
  • 【数据结构】空间复杂度
  • jemalloc 5.3.0的tsd模块的源码分析
  • LeetCode讲解篇之88. 合并两个有序数组
  • C语言算法实现:探索经典排序与查找算法的奥秘
  • 在亚马逊云科技上用Stable Diffusion 3.5 Large生成赛博朋克风图片(下)
  • Day27-【13003】短文,线性表两种基本实现方式空间效率、时间效率比较?兼顾优点的静态链表是什么?如何融入空闲单元链表来解决问题?
  • 二分查找题目:寻找两个正序数组的中位数
  • Maya快捷键
  • 遗传算法与深度学习实战(32)——生成对抗网络详解与实现
  • Python dataclasses模块介绍
  • UE学习日志#13 (还是记录看资料,没内容)GAS--理解GC和UE网络同步原理
  • 格式化指南:格式化选NTFS、FAT32还是 exFAT?
  • 28. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表定时器与报表数据修正
  • DeepSeek学术写作测评第一弹:论文润色,中译英效果如何?
  • 【算法篇·更新中】C++秒入门(附练习用题目)
  • 【C语言基础】编译并运行第一个C程序
  • 消息队列MQ面试题解,基础面试题
  • 美国本科申请文书PS写作中的注意事项
  • 【Linux基础指令】第二期
  • Oracle 12c 中的 CDB和PDB的启动和关闭
  • 数字人+展厅应用方案:开启全新沉浸式游览体验
  • SimpleFOC STM32教程10|基于STM32F103+CubeMX,速度闭环控制(有电流环)