Jacky's blog Jacky's blog
首页
  • 编码专题
  • 深入浅出 Vite
  • 深入浅出 babel
  • 快速上手API
  • 深入浅出 react
  • Node

    • code-notebook
  • 状态管理

    • redux
  • 前端工程化

    • Wepack
  • React源码

    • React源码
  • 组件库封装

    • 组件库
  • 开发工具

    • Vscode 插件
  • 项目展示
  • 案例中心 (opens new window)
  • First Project
  • 基础算法题
  • 链表题
  • 动态规划
  • 双指针
  • 递归
  • 数据结构
  • 前端学习计划 (opens new window)
  • 技术随笔
  • 转载文章
  • 包管理工具
  • 前端学习周报
  • VSCode插件
  • Promise 专题
  • 函数技巧
  • React 专题
  • 配置文件

    • TSCONFIG-配置 (opens new window)
    • NGINX-配置 (opens new window)
    • 正则规则查询手册 (opens new window)
    • Lint 配置 (opens new window)
  • 教程

    • GIT-教程
    • NPM SCRIPTS-工作流 (opens new window)
    • DOCKER-教程 (opens new window)
    • LERNA-教程 (opens new window)
    • GIT-常用操作整理 (opens new window)
  • VSCode

    • LAUNCH.JSON (opens new window)
  • 指令

    • NPM 指令 (opens new window)
    • NVM 指令 (opens new window)
    • Nginx 指令 (opens new window)
    • YARN 指令 (opens new window)
    • PNPM 指令 (opens new window)
  • 库

    • FS-EXTRA 库 (opens new window)
    • NODE 库-PATH (opens new window)
  • 永远的神

    • 魔法师卡颂-自顶向下学 React 源码 (opens new window)
    • 全栈潇晨 (opens new window)
    • 博客-程序员山月-Daily (opens new window)
    • 淘系前端:冴羽 (opens new window)
  • 系列文章

    • 《图解HTTP》 (opens new window)
    • 《ES6标准入门》 (opens new window)
    • 《现代JavaScript教程》 (opens new window)
    • 《深入浅出Webpack》 (opens new window)
    • VSCode 插件系列:小茗同学 (opens new window)
    • JEST 教程 (opens new window)
    • 前端精读周刊:各种精读系列 (opens new window)
    • 一文吃透系列 (opens new window)
    • 图解 REACT 原理 (opens new window)
  • 实用网站

    • MDN (opens new window)
    • CAN I USE (opens new window)
    • TYPESCRIPT-ESLint-RULES (opens new window)
    • ESLint-RULES (opens new window)
    • FRONT-END TREND (opens new window)
    • NPM TREND (opens new window)
    • 在线分析 Node 依赖 (opens new window)
    • FIND NPM (opens new window)
    • CODE PEN (opens new window)
    • 印记中文 (opens new window)
    • TOOL.LU (opens new window)
    • 阮一峰-网道 (opens new window)
    • DIGITAL OCEAN (opens new window)
    • DEVDOCS.IO (opens new window)
    • JOI (opens new window)
  • 算法

    • 小浩算法 (opens new window)
    • LABULADONG 的算法小抄 (opens new window)
    • 力扣 SOLUTION (opens new window)
    • HACKER RANK (opens new window)
    • 代码随想录 (opens new window)
  • 博客系列

    • 美团大佬 (opens new window)
    • 蜡笔小伟 (opens new window)
    • 优秀博客1 (opens new window)
    • 优秀博客2-umi (opens new window)
    • 优质博客 (opens new window)
  • CSS

    • CSS-EASING 库 (opens new window)
    • ROUGH.JS (opens new window)
    • CSS 网站收集
    • UNOCSS (opens new window)
  • 前端

    • PROMISE (opens new window)
    • UNDERSCORE.JS (opens new window)
    • study with BGM (opens new window)
    • nginx【B站视频】 (opens new window)
    • 机器学习
    • Js基础
  • 掘金已购课程

    • 前端自动化测试精讲 (opens new window)
    • 深入浅出 Vite (opens new window)
    • 现代 Web 布局 (opens new window)
    • 前端算法与数据结构 (opens new window)
    • 基于 Vite 的 SSG 框架开发实战 (opens new window)
    • SSR 实战:官网开发指南 (opens new window)
    • WebGL 入门与实践 (opens new window)
    • 玩转 CSS 的艺术之美 (opens new window)
    • 前端调试通关秘籍 (opens new window)
    • React 进阶实践指南 (opens new window)
    • TypeScript 全面进阶指南 (opens new window)
    • 前端缓存技术与方案解析 (opens new window)
    • npm scripts 前端工作流 (opens new window)
    • Webpack5 核心原理与应用实践 (opens new window)
  • 购物车

    • 张鑫旭-技术写作指南 (opens new window)
    • 深入剖析 Node.js 底层原理 (opens new window)
    • 前端开发者的现代 C++ 课 (opens new window)
    • 从前端到全栈 (opens new window)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Jacky Wang

行到水穷处,坐看云起时
首页
  • 编码专题
  • 深入浅出 Vite
  • 深入浅出 babel
  • 快速上手API
  • 深入浅出 react
  • Node

    • code-notebook
  • 状态管理

    • redux
  • 前端工程化

    • Wepack
  • React源码

    • React源码
  • 组件库封装

    • 组件库
  • 开发工具

    • Vscode 插件
  • 项目展示
  • 案例中心 (opens new window)
  • First Project
  • 基础算法题
  • 链表题
  • 动态规划
  • 双指针
  • 递归
  • 数据结构
  • 前端学习计划 (opens new window)
  • 技术随笔
  • 转载文章
  • 包管理工具
  • 前端学习周报
  • VSCode插件
  • Promise 专题
  • 函数技巧
  • React 专题
  • 配置文件

    • TSCONFIG-配置 (opens new window)
    • NGINX-配置 (opens new window)
    • 正则规则查询手册 (opens new window)
    • Lint 配置 (opens new window)
  • 教程

    • GIT-教程
    • NPM SCRIPTS-工作流 (opens new window)
    • DOCKER-教程 (opens new window)
    • LERNA-教程 (opens new window)
    • GIT-常用操作整理 (opens new window)
  • VSCode

    • LAUNCH.JSON (opens new window)
  • 指令

    • NPM 指令 (opens new window)
    • NVM 指令 (opens new window)
    • Nginx 指令 (opens new window)
    • YARN 指令 (opens new window)
    • PNPM 指令 (opens new window)
  • 库

    • FS-EXTRA 库 (opens new window)
    • NODE 库-PATH (opens new window)
  • 永远的神

    • 魔法师卡颂-自顶向下学 React 源码 (opens new window)
    • 全栈潇晨 (opens new window)
    • 博客-程序员山月-Daily (opens new window)
    • 淘系前端:冴羽 (opens new window)
  • 系列文章

    • 《图解HTTP》 (opens new window)
    • 《ES6标准入门》 (opens new window)
    • 《现代JavaScript教程》 (opens new window)
    • 《深入浅出Webpack》 (opens new window)
    • VSCode 插件系列:小茗同学 (opens new window)
    • JEST 教程 (opens new window)
    • 前端精读周刊:各种精读系列 (opens new window)
    • 一文吃透系列 (opens new window)
    • 图解 REACT 原理 (opens new window)
  • 实用网站

    • MDN (opens new window)
    • CAN I USE (opens new window)
    • TYPESCRIPT-ESLint-RULES (opens new window)
    • ESLint-RULES (opens new window)
    • FRONT-END TREND (opens new window)
    • NPM TREND (opens new window)
    • 在线分析 Node 依赖 (opens new window)
    • FIND NPM (opens new window)
    • CODE PEN (opens new window)
    • 印记中文 (opens new window)
    • TOOL.LU (opens new window)
    • 阮一峰-网道 (opens new window)
    • DIGITAL OCEAN (opens new window)
    • DEVDOCS.IO (opens new window)
    • JOI (opens new window)
  • 算法

    • 小浩算法 (opens new window)
    • LABULADONG 的算法小抄 (opens new window)
    • 力扣 SOLUTION (opens new window)
    • HACKER RANK (opens new window)
    • 代码随想录 (opens new window)
  • 博客系列

    • 美团大佬 (opens new window)
    • 蜡笔小伟 (opens new window)
    • 优秀博客1 (opens new window)
    • 优秀博客2-umi (opens new window)
    • 优质博客 (opens new window)
  • CSS

    • CSS-EASING 库 (opens new window)
    • ROUGH.JS (opens new window)
    • CSS 网站收集
    • UNOCSS (opens new window)
  • 前端

    • PROMISE (opens new window)
    • UNDERSCORE.JS (opens new window)
    • study with BGM (opens new window)
    • nginx【B站视频】 (opens new window)
    • 机器学习
    • Js基础
  • 掘金已购课程

    • 前端自动化测试精讲 (opens new window)
    • 深入浅出 Vite (opens new window)
    • 现代 Web 布局 (opens new window)
    • 前端算法与数据结构 (opens new window)
    • 基于 Vite 的 SSG 框架开发实战 (opens new window)
    • SSR 实战:官网开发指南 (opens new window)
    • WebGL 入门与实践 (opens new window)
    • 玩转 CSS 的艺术之美 (opens new window)
    • 前端调试通关秘籍 (opens new window)
    • React 进阶实践指南 (opens new window)
    • TypeScript 全面进阶指南 (opens new window)
    • 前端缓存技术与方案解析 (opens new window)
    • npm scripts 前端工作流 (opens new window)
    • Webpack5 核心原理与应用实践 (opens new window)
  • 购物车

    • 张鑫旭-技术写作指南 (opens new window)
    • 深入剖析 Node.js 底层原理 (opens new window)
    • 前端开发者的现代 C++ 课 (opens new window)
    • 从前端到全栈 (opens new window)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 编码专题

  • 深入浅出 Vite

  • 快速上手 API

    • perf_hooks
      • 0.简介
      • 1.What is perf_hooks?
      • 2.How to use?
      • 3. How to use PerformanceObserver?
        • 3.1 measure duration
        • 3.2 measure newWork
  • 深入浅出Babel

  • 深入浅出 React

  • 百问掘金
  • 快速上手 API
wangjiasheng
2023-04-09
目录

perf_hooks

# 0.简介

本篇博客快速上手 perf_hooks,示例仓库 (opens new window)

# 1.What is perf_hooks?

perf_hooks 是 Node.js 中的一个模块,它提供了一个性能分析 API,可用于测量和分析 Node.js 应用程序的性能。

使用 perf_hooks 模块,您可以测量事件的执行时间、瞬时堆大小、CPU 使用率等指标,以便找出应用程序的瓶颈并进行优化。

perf_hooks 模块提供了四个主要的性能分析类:PerformanceObserver、PerformanceEntry、PerformanceMark 和 PerformanceMeasure。这些类可用于测量事件的性能,并为性能分析提供数据。

PerformanceObserver 用于监视性能指标并在这些指标发生变化时通知您。PerformanceEntry 包含了对性能测量的详细描述,例如开始时间、结束时间、测量名称等。PerformanceMark 和 PerformanceMeasure 分别表示要测量的事件的开始和结束时间。

通过使用这些类,您可以收集有关应用程序性能的详细信息,并通过分析和解释这些信息来优化应用程序的性能。

# 2.How to use?

当使用 performance 测量函数的执行时间时,可以使用 performance.now() 方法获取当前时间戳。以下是一个测量函数执行时间的示例代码:

const start = performance.now();

// 执行函数
myFunction();

const end = performance.now();
const duration = end - start;

console.log(`myFunction() 执行时间为 ${duration} 毫秒`);
1
2
3
4
5
6
7
8
9

要测量函数的内存使用情况,可以使用 Node.js 中的 process.memoryUsage() 方法。以下是一个测量函数内存使用情况的示例代码:

const memoryBefore = process.memoryUsage().heapUsed;

// 执行函数
myFunction();

const memoryAfter = process.memoryUsage().heapUsed;
const memoryUsage = memoryAfter - memoryBefore;

console.log(`myFunction() 内存使用量为 ${memoryUsage} 字节`);
1
2
3
4
5
6
7
8
9

# 3. How to use PerformanceObserver?

# 3.1 measure duration

PerformanceObserver 是 Node.js perf_hooks 模块提供的一个类,用于监视应用程序的性能指标并在这些指标发生变化时通知您。以下是使用 PerformanceObserver 的基本步骤:

  1. 创建 PerformanceObserver 实例:

    const { PerformanceObserver, performance } = require('perf_hooks');
    
    const obs = new PerformanceObserver((list, observer) => {
      // 在这里处理性能指标
      console.log(list.getEntries());
    });
    
    1
    2
    3
    4
    5
    6
  2. 使用 observe() 方法开始观察指定的性能指标,可以选择从以下列表中的一个或多个指标中进行观察:

    • entryTypes: 数组,包含要观察的性能指标类型,例如 'mark'、'measure'、'navigation'、'resource' 等。
    • buffered: 布尔值,指定是否在 observe() 调用之前缓存过去的性能指标。
    obs.observe({ entryTypes: ['mark', 'measure'], buffered: true });
    
    1
  3. 当 PerformanceObserver 检测到与观察的指标类型匹配的性能指标时,触发回调函数。在回调函数中,您可以处理性能指标数据,例如将数据发送到日志或监控系统。

    const obs = new PerformanceObserver((list, observer) => {
      console.log(list.getEntries());
      // 将数据发送到日志或监控系统等
    });
    
    obs.observe({ entryTypes: ['mark', 'measure'], buffered: true });
    
    1
    2
    3
    4
    5
    6
  4. 当不再需要观察性能指标时,可以调用 disconnect() 方法停止 PerformanceObserver。

    obs.disconnect();
    
    1

    使用 PerformanceObserver,您可以监视多个性能指标并收集应用程序的性能数据,以便找出瓶颈并进行优化。

简单示例:如计算 Fibonacci(35) 需要的时间以及耗费的内存

使用 observer :

const obs = new PerformanceObserver((list, observer) => {
  // 在这里处理性能指标, 如将数据发送到日志或监控系统等
  list.getEntries().forEach((entry) => {
    if (entry.name === "myMeasure") {
      console.log(`【TEST2】fib(35) 执行时间为 ${entry.duration} 毫秒`);
    }
  });
  // 清空标记
  performance.clearMarks();
});

obs.observe({ entryTypes: ["mark", "measure"], buffered: true });

// 标记开始时间
performance.mark("start");

// 统计耗时版 Fibonacci 函数
let result = fib(35);

// 标记结束时间
performance.mark("end");

/* 使用 measure 去计算时间差 */
// 计算从 "start" 到 "end" 之间的时间
performance.measure("myMeasure", "start", "end");
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

通过 list.getEntries 可根据 entryTypes:[] 数组中指定的内容获取标记节点的一些信息。

list.getEntries()
>(3) [PerformanceMark, PerformanceMeasure, PerformanceMark]
0: PerformanceMark {Symbol(kName): 'start', Symbol(kType): 'mark', Symbol(kStart): , Symbol(kDuration): 0, Symbol(kDetail): null}
1: PerformanceMeasure {Symbol(kName): 'myMeasure', Symbol(kType): 'measure', Symbol(kStart): 1119.0044589042664, Symbol(kDuration): 93.45970821380615, Symbol(kDetail): null}
2: PerformanceMark {Symbol(kName): 'end', Symbol(kType): 'mark', Symbol(kStart): 1212.4641671180725, Symbol(kDuration): 0, Symbol(kDetail): null}
length: 3
1
2
3
4
5
6

通过获取 PerformanceMeasure 的 duration 的结果为:93.45970821380615

其结果就等于 PermformceMark 标记为end(1212.4641671180725) 与 start(1119.0044589042664) 相减。

# 3.2 measure newWork

将 observer.observe({ entryTypes: ["resource"] }) 设置为 resource 即可。

打开示例文档中的 measure-network.html

<!DOCTYPE html>
<html lang="en">
<body>
  <div id="root"></div>
</body>
<script>
  const observer = new PerformanceObserver((list) => {
    const entries = list.getEntries();
    console.log("资源下载用时:", entries[0].duration);
  });
  observer.observe({ entryTypes: ["resource"] });
  // 加载一个图片资源
  const img = new Image();
  img.src =
    "https://wjs-tik.oss-cn-shanghai.aliyuncs.com/img/337bde0672199d903ab0a962d9e0ca79.jpg";
  document.getElementById("root").appendChild(img)
</script>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

打开控制面板,观察资源下载耗时为 348ms

通过 node 可以更精确获取资源下载用时为 348.7999999523163 ms

编辑 (opens new window)
上次更新: 2023/04/09, 21:04:00
16-Vite搭建 SSR 框架
如何封装 @babel:code-frame ?

← 16-Vite搭建 SSR 框架 如何封装 @babel:code-frame ?→

最近更新
01
如何理解浏览器的 user agent 用户代理的含义?
11-05
02
浏览器事件循环机制
10-31
03
浏览器页面渲染机制【2023】
10-15
更多文章>
Theme by Vdoing | Copyright © 2020-2023
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式