Skip to content

性能分析工具

Chrome DevTools

1. Performance面板

功能介绍

Performance面板是Chrome DevTools中用于分析页面性能的核心工具,可以录制和分析页面的加载、渲染和交互性能。

使用方法

  1. 打开Performance面板

    • 按F12打开Chrome DevTools
    • 点击"Performance"标签
  2. 录制性能

    • 点击录制按钮(圆形图标)
    • 执行需要分析的操作(如页面加载、点击按钮等)
    • 点击停止按钮(方形图标)
  3. 分析结果

    • 概览面板:查看FPS、CPU、内存使用情况
    • 火焰图:查看函数执行时间和调用关系
    • 网络请求:查看网络请求的时间和顺序
    • 主线程:查看主线程的任务执行情况

关键指标

  • FPS:每秒帧数,绿色柱状图越高越好
  • CPU:CPU使用率,颜色表示不同类型的操作
  • 内存:内存使用情况,包括JS堆、文档、DOM节点等
  • Network:网络请求时间线
  • Main:主线程任务执行时间线

性能瓶颈识别

  • 长任务:执行时间超过50ms的任务,会阻塞主线程
  • 重排:黄色块,表示布局计算
  • 重绘:紫色块,表示绘制操作
  • 网络延迟:红色块,表示网络请求等待时间

示例分析

javascript
// 录制性能后,查看火焰图
// 识别长任务
function longTask() {
  // 执行时间超过50ms的任务
  for (let i = 0; i < 1000000; i++) {
    // 计算
  }
}

// 优化:拆分为多个短任务
function optimizedTask() {
  let i = 0;
  function processChunk() {
    const end = Math.min(i + 10000, 1000000);
    for (; i < end; i++) {
      // 计算
    }
    if (i < 1000000) {
      requestAnimationFrame(processChunk);
    }
  }
  processChunk();
}

2. Memory面板

功能介绍

Memory面板用于分析页面的内存使用情况,包括堆快照、内存分配时间线和分配采样。

使用方法

  1. 堆快照(Heap snapshot)

    • 选择"Take heap snapshot"
    • 点击"Take snapshot"
    • 等待快照生成
    • 查看对象的内存使用情况
  2. 内存分配时间线(Allocation timeline)

    • 选择"Allocation timeline"
    • 点击录制按钮
    • 执行操作
    • 停止录制
    • 查看内存分配情况
  3. 分配采样(Allocation sampling)

    • 选择"Allocation sampling"
    • 点击录制按钮
    • 执行操作
    • 停止录制
    • 查看内存分配的函数调用栈

内存泄漏检测

  1. 堆快照比较

    • 拍摄初始快照
    • 执行可能导致内存泄漏的操作
    • 拍摄新快照
    • 选择"Comparison"视图,查看增加的对象
  2. 内存分配时间线

    • 录制内存分配
    • 查看持续增长的内存分配
    • 识别导致内存泄漏的代码

示例分析

javascript
// 内存泄漏示例
let elements = [];

function createElements() {
  for (let i = 0; i < 100; i++) {
    const element = document.createElement('div');
    element.textContent = `Element ${i}`;
    elements.push(element);
  }
}

// 优化:清理DOM引用
function cleanupElements() {
  elements = [];
}

3. Network面板

功能介绍

Network面板用于分析网络请求的性能,包括请求时间、大小、优先级等。

使用方法

  1. 打开Network面板

    • 按F12打开Chrome DevTools
    • 点击"Network"标签
  2. 录制网络请求

    • 刷新页面或执行操作
    • 查看网络请求列表
  3. 分析结果

    • 请求列表:查看请求的详细信息
    • 时间线:查看请求的时间顺序
    • 瀑布图:查看请求的各个阶段的时间

关键指标

  • Name:请求的名称
  • Status:HTTP状态码
  • Type:请求的类型
  • Initiator:请求的发起者
  • Size:响应的大小
  • Time:请求的总时间
  • Waterfall:请求的各个阶段的时间

网络优化识别

  • 大文件:响应大小较大的文件
  • 慢请求:总时间较长的请求
  • 重复请求:重复的网络请求
  • 未压缩的文件:没有启用压缩的文件
  • 未缓存的文件:没有设置缓存的文件

示例分析

javascript
// 网络请求优化
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data));

// 优化:使用缓存
fetch('https://api.example.com/data', {
  headers: {
    'Cache-Control': 'max-age=3600'
  }
})
  .then(response => response.json())
  .then(data => console.log(data));

4. Lighthouse面板

功能介绍

Lighthouse是一个开源工具,用于评估网页的质量,包括性能、可访问性、最佳实践、SEO和PWA。

使用方法

  1. 打开Lighthouse面板

    • 按F12打开Chrome DevTools
    • 点击"Lighthouse"标签
  2. 配置和运行

    • 选择评估类别(性能、可访问性、最佳实践、SEO、PWA)
    • 选择设备类型(移动设备、桌面设备)
    • 点击"Generate report"
    • 等待报告生成
  3. 分析结果

    • 性能得分:0-100分,越高越好
    • 核心Web指标:LCP、FID、CLS的得分
    • 机会:可以改进的项目
    • 诊断:性能问题的诊断
    • 通过的审计:符合最佳实践的项目

性能建议

  • 减少未使用的JavaScript:移除或延迟加载未使用的JavaScript
  • 减少未使用的CSS:移除未使用的CSS
  • 优化图片:压缩图片,使用适当的格式
  • 启用文本压缩:启用gzip或brotli压缩
  • 使用浏览器缓存:设置适当的缓存头
  • 减少服务器响应时间:优化服务器性能

示例分析

javascript
// Lighthouse报告建议
// 减少未使用的JavaScript
// 优化:代码分割
import('./module.js').then(module => {
  module.doSomething();
});

// 优化图片
// 使用WebP格式
<picture>
  <source srcset="image.webp" type="image/webp">
  <img src="image.jpg" alt="图片">
</picture>

5. Rendering面板

功能介绍

Rendering面板用于分析页面的渲染性能,包括绘制区域、帧率、布局偏移等。

使用方法

  1. 打开Rendering面板

    • 按F12打开Chrome DevTools
    • 点击"More tools" → "Rendering"
  2. 启用功能

    • Paint flashing:高亮显示重绘区域
    • Layout shifts:高亮显示布局偏移
    • FPS meter:显示实时FPS
    • Layer borders:显示合成层边框
    • Frame rendering stats:显示帧渲染统计信息

渲染优化识别

  • 重绘区域:高亮显示的区域,越大越差
  • 布局偏移:高亮显示的元素移动,越少越好
  • 帧率:FPS越低,性能越差
  • 合成层:过多的合成层会影响性能

示例分析

javascript
// 渲染优化
// 不好的做法:使用left/top
function animate() {
  element.style.left = '10px';
  element.style.top = '10px';
}

// 好的做法:使用transform
function animateOptimized() {
  element.style.transform = 'translate(10px, 10px)';
}
加载中...

好好学习,天天向上