性能分析

在本节中,我们将探讨如何对 Rspack 进行性能分析以识别瓶颈。通过检查 Rspack 在哪里花费时间,我们可以深入了解如何提高性能。由于不同的分析器具有不同的优势,因此最好使用多种分析器。

跟踪

tracing 用于对 Rspack 进行跟踪。

支持的跟踪级别:

  • 发布版本:INFOWARNERROR
  • 调试版本:TRACEDEBUGINFOWARNERROR

两种启用跟踪的方法

  • 如果您使用的是 @rspack/cli,可以通过 RSPACK_PROFILE 环境变量来启用跟踪。
  • 如果您使用的是 @rspack/core 而不是 @rspack/cli,可以通过 rspack.experiments.globalTrace.registerrspack.experiments.globalTrace.cleanup 来启用跟踪。请查看 我们在 @rspack/cli 中如何使用这两个函数来实现 RSPACK_PROFILE,以了解更多详细信息。

Chrome

tracing-chrome 支持图形化查看跟踪信息。

image

在运行 Rspack 之前设置环境变量 RSPACK_PROFILE=TRACE=layer=chrome,例如

RSPACK_PROFILE=TRACE=layer=chrome rspack build

将在当前工作目录中生成一个跟踪文件(.rspack-profile-${timestamp}-${pid}/trace.json)。

JSON 跟踪文件可以在 chrome://tracingui.perfetto.dev 中查看。

终端

可以通过 RSPACK_PROFILE=TRACE=layer=logger 在终端查看详细的跟踪事件值,例如

RSPACK_PROFILE=TRACE=layer=logger rspack build

将打印传递给 Rspack 的选项以及每个单独的跟踪事件。

Nodejs 性能分析

如果我们发现性能瓶颈是在 JS 端(例如 js 加载器),那么我们需要进一步分析 JS 端,可以使用 Nodejs 性能分析来分析。例如

node --cpu-prof {rspack_bin_path} -c rspack.config.js

RSPACK_PROFILE=JSCPU rspack build

这将生成一个 CPU 分析文件,例如 CPU.20230522.154658.14577.0.001.cpuprofile,可以使用 speedscope 来可视化分析结果,例如

npm install -g speedscope
speedscope CPU.20230522.154658.14577.0.001.cpuprofile

Rsdoctor 时间轴

如果我们想分析加载器和插件的时间成本或加载器的编译行为,可以使用 Rsdoctor 来查看

image

请参考 Rsdoctor 编译分析

Mac Xcode Instruments

如果您使用的是 Mac,可以使用 Xcode Instruments 生成 CPU 分析结果。

image

要安装 Xcode Instruments,只需安装命令行工具

xcode-select --install

对于普通的 Rust 构建,可以使用 cargo instruments 作为性能分析和生成跟踪文件的粘合剂。

由于 Rspack 构建需要相当长的时间,因此您可以使用以下步骤而不调用 cargo instruments。它具有相同的效果。

在工作区根目录的 Cargo.toml 中,在 [profile.release] 部分启用调试符号并禁用符号剥离

[profile.release]
debug = 1 # debug info with line tables only
strip = false # do not strip symbols

然后构建项目

pnpm run build:cli:release

构建项目后,最终的二进制文件将位于 packages/rspack-cli/bin/rspack 中。

在幕后,cargo instruments 调用 xcrun 命令,这意味着我们可以在使用 Rspack 的自己的项目中运行以下命令。

xcrun xctrace record --template 'Time Profile' --output . --launch -- /path/to/rspack/packages/rspack-cli/bin/rspack build

它将生成以下输出

使用时间分析器模板开始录制。启动进程:rspack。按 Ctrl-C 停止录制目标应用程序已退出,结束录制...录制完成。正在保存输出文件...输出文件已保存为:Launch_rspack_2023-04-24_11.32.06_9CFE3A63.trace

我们可以通过以下方式打开跟踪文件

open Launch_rspack_2023-04-24_11.32.06_9CFE3A63.trace