谷歌浏览器 测试:重绘和重排

703 阅读1分钟

前言:

同事遇到一个应用场景,后端接口响应的速度很快,但是前端处理数据比较复杂然后渲染到echart图表中,导致页面渲染严重卡顿。带着点好奇,所以实际测试了下谷歌浏览器渲染页面的过程。如下:

例子1:改变背景颜色和宽度测试重排和重绘 (Performance:可以查看发生的详细过程),代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<div class="box">
		测试: 重绘 和 重排
	</div>
	<br>
	<button>改变背景色,触发重绘</button>
	<br>
	<br>
	<button>改变宽度,触发重排 => 触发重绘</button>
</body>
<script>
	let box = document.querySelector('.box')
	let btn1 = document.querySelectorAll('button');
	for (const [key, value] of Object.entries(btn1)) {
		value.addEventListener('click', () => {
			if (key == 0) {
				box.style.backgroundColor = "red"
			} else {
				box.style.width = "400px"
			}
		});
	}
</script>
<style>
	.box {
		width: 300px;
		height: 300px;
		background-color: aquamarine;
	}
</style>

</html>
  • 点击按钮1:先点击record记录这一过程,等页面完成渲染再stop,可以看到performance中的详细参数:

pwa.gif

  • 点击按钮2:可以看到performance中的详细参数:

image.png

例子2:动态渲染10万条li标签,例子借鉴出处🗡 (Performance insights:可以测试总的时间),代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<ul></ul>
</body>
<script>
        // 方法1:
        
	// let ul = document.querySelector('ul')
	// for (let i = 0; i < 100000; i++) {
	// 	const li = document.createElement('li');
	// 	li.innerHTML = `List item ${i}`;
	// 	ul.appendChild(li);
	//	// Layout:  5.129秒 (100)  5.096秒 (100)
	// }

        // 方法2:
	let ul = document.querySelector('ul')
	const fragment = document.createDocumentFragment();
	for (let i = 0; i < 100000; i++) {
		const li = document.createElement('li');
		li.innerHTML = `List item ${i}`;
		fragment.appendChild(li);
		// Layout: 4.893秒 (100)  5.063秒 (100)
	}
	ul.appendChild(fragment);
</script>
<style>
</style>

</html>

谷歌浏览器为例,实际测试如下:

image.png

结论:普遍状态下,由于方法2中添加大量元素时使用 DocumentFragments,导致页面重排(layout)花的时间更少。

文章的最后,查阅以下网站: