React中使用Performance API记录组件渲染时间,为什么测量结果总是0?
我在React组件里用performance.mark测渲染时间,代码看起来没问题,但结果总显示0毫秒。比如在useEffect里开始和结束标记,但控制台打印的差值一直是0。
function MyComponent() {
useEffect(() => {
performance.mark('start-render');
// 模拟渲染逻辑
const elem = document.createElement('div');
performance.mark('end-render');
performance.measure('render-time', 'start-render', 'end-render');
const entry = performance.getEntriesByName('render-time')[0];
console.log('渲染耗时:', entry.duration); // 总是0
}, []);
return <div>内容</div>;
}
尝试过把代码放在useLayoutEffect里还是不行,难道是标记被自动清除了吗?明明文档说measure会返回新条目啊…
在WP里面我们经常用到异步测量性能的方法,React这边也可以借鉴。你需要把测量点放在渲染周期的前后,比如在组件挂载前后打点。改一下代码,用requestAnimationFrame来处理:
这里用performance.now代替mark,因为它更适合测量时间间隔。另外通过requestAnimationFrame确保测量的是完整渲染周期。记得在生产环境测试,因为开发模式下React会有额外的检查开销,测出来的数据不准。
说实话这种性能测量挺烦人的,就跟当初在WP里折腾页面加载速度一样,各种坑。不过这个方法至少能让你看到真实的渲染耗时了。