Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何去衡量用户操作过程中否卡顿【热度: 492】 #1085

Open
yanlele opened this issue Jan 9, 2025 · 0 comments
Open

如何去衡量用户操作过程中否卡顿【热度: 492】 #1085

yanlele opened this issue Jan 9, 2025 · 0 comments
Labels
工程化 web 项目工程化 腾讯 公司标签
Milestone

Comments

@yanlele
Copy link
Member

yanlele commented Jan 9, 2025

关键词:卡顿、性能、用户体验

  1. 使用浏览器性能指标 - FPS(每秒帧数)

    • 基本原理:FPS 是衡量页面流畅度的重要指标。在浏览器中,动画和交互的流畅呈现通常依赖于较高的 FPS。一般来说,当 FPS 达到 60 时,用户体验会比较流畅,因为这意味着每秒有 60 帧画面更新,人眼很难察觉到卡顿。如果 FPS 低于 30,用户就可能明显感觉到页面卡顿。
    • 如何获取 FPS 数据:可以使用requestAnimationFrame函数来计算 FPS。以下是一个简单的 JavaScript 示例,用于监测页面的 FPS:
      let frameCount = 0;
      let lastTime = 0;
      const fpsArray = [];
      function calculateFps() {
        const now = performance.now();
        frameCount++;
        if (now - lastTime >= 1000) {
          const fps = frameCount;
          fpsArray.push(fps);
          frameCount = 0;
          lastTime = now;
        }
        requestAnimationFrame(calculateFps);
      }
      calculateFps();
      • 这个代码片段定义了一个函数calculateFps,它使用performance.now函数获取当前时间戳。每执行一次requestAnimationFrame回调函数(通常每秒执行约 60 次),frameCount就加 1。当时间间隔达到 1000 毫秒(1 秒)时,计算出 FPS 并存储在fpsArray中。通过分析fpsArray中的数据,可以了解页面在一段时间内的 FPS 情况,从而判断是否卡顿。
  2. 监测 Long Tasks(长任务)

    • 基本原理:当浏览器执行 JavaScript 任务的时间过长时,就会导致页面卡顿。Long Tasks 是指那些执行时间超过 50 毫秒的任务,因为浏览器在执行这些任务时,无法及时响应用户的其他操作,如滚动、点击等。
    • 如何监测 Long Tasks:可以使用浏览器的PerformanceObserver来监测 Long Tasks。以下是一个示例:
      const observer = new PerformanceObserver((list) => {
        for (const entry of list.getEntries()) {
          if (entry.duration > 50) {
            console.log("发现长任务:", entry);
          }
        }
      });
      observer.observe({ entryTypes: ["longtask"] });
      • 这段代码创建了一个PerformanceObserver对象,它会监听longtask类型的性能条目。当发现执行时间超过 50 毫秒的任务时,会在控制台打印相关信息,包括任务的开始时间、持续时间等,通过这些信息可以定位导致卡顿的代码部分。
  3. 分析 First Input Delay(首次输入延迟 - FID)

    • 基本原理:FID 衡量的是用户首次与页面交互(如点击、按键等)到浏览器开始响应这个交互的时间间隔。一个较低的 FID 表示页面能够快速响应用户操作,而较高的 FID 则可能导致用户感觉到卡顿。
    • 如何获取 FID 数据:可以使用浏览器的PerformanceObserver和相关的性能 API 来测量 FID。以下是一个示例:
      let startTime;
      const observer = new PerformanceObserver((list) => {
        for (const entry of list.getEntries()) {
          if (entry.name === "first - input") {
            const delay = entry.startTime - startTime;
            console.log("首次输入延迟:", delay);
          }
        }
      });
      observer.observe({ entryTypes: ["first - input"] });
      document.addEventListener("click", (event) => {
        startTime = performance.now();
        // 模拟一个任务,可能导致延迟
        setTimeout(() => {
          console.log("任务完成");
        }, 100);
      });
      • 在这个示例中,当用户点击页面时,记录开始时间startTime,然后通过PerformanceObserver监听first - input类型的性能条目。当监听到这个条目时,计算并打印出 FID。通过这种方式,可以评估用户操作后的响应延迟情况。
@yanlele yanlele added 工程化 web 项目工程化 腾讯 公司标签 labels Jan 9, 2025
@yanlele yanlele added this to the milestone Jan 9, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
工程化 web 项目工程化 腾讯 公司标签
Projects
None yet
Development

No branches or pull requests

1 participant