跳转到内容

性能

Node.js 在处理对原生模块(如 sharp)的异步调用时使用 libuv 管理的线程池。

sharp 可以并行处理的最大图像数量由 libuv 的 UV_THREADPOOL_SIZE 环境变量控制,默认值为 4。

当使用超过 4 个物理 CPU 核心时,应在 Node.js 进程启动前设置此环境变量,以增加线程池大小。

export UV_THREADPOOL_SIZE="$(lscpu -p | egrep -v "^#" | sort -u -t, -k 2,4 | wc -l)"

libvips 使用共享线程池来避免创建新线程的开销。

该线程池的大小会根据需求增长,并在空闲时缩小。

默认用于并发处理每张图像的线程数与 CPU 核心数量相同, 但在使用基于 glibc 的 Linux 且未使用 jemalloc 的情况下,默认线程数为 1,以帮助减少内存碎片。

可使用 sharp.concurrency() 来管理每张图像的线程数。

在使用默认的 Linux glibc 内存分配器时,为减少内存碎片, 应在 Node.js 进程启动前设置 MALLOC_ARENA_MAX 环境变量以减少内存池数量。

export MALLOC_ARENA_MAX="2"

一个用来比较本模块与其他替代方案性能的测试。

启用缓存(默认)且使用 8 核以上机器时,可以预期 libvips 性能更佳, 尤其是具有较大 L1/L2 CPU 缓存的机器。

相关(解)压缩库的 I/O 限制通常决定最大吞吐量。

  • jimp v1.6.1 - 纯 JavaScript 图像处理。
  • imagemagick v0.1.3 - 仅支持文件系统,并且“已经长期无人维护”。
  • gm v1.25.1 - GraphicsMagick gm 命令行工具的完整封装,但“已经停止维护”。
  • sharp v0.35.0 / libvips v8.18.2 - 为确保公平比较,已禁用 libvips 内部缓存。
  • AWS EC2 us-west-2 c8a.xlarge (4x AMD EPYC 9R45)
  • Ubuntu 25.10
  • Node.js 24.15.0
  • AWS EC2 us-west-2 c8g.xlarge (4x ARM Graviton4)
  • Ubuntu 25.10
  • Node.js 24.15.0

解压一个 2725x2225 的 JPEG 图像, 使用 Lanczos 3 重采样(可用时)调整大小至 720x588, 然后以“质量”设置 80 重新压缩为 JPEG。

注意:jimp 不支持 Lanczos 3,改用双三次重采样。

PackageI/OOps/secSpeed-up
jimpbuffer3.441.0
jimpfile3.651.1
imagemagickfile16.234.7
gmbuffer20.926.1
gmfile21.046.1
sharpstream82.8724.1
sharpfile88.2125.6
sharpbuffer89.6326.1
PackageI/OOps/secSpeed-up
jimpbuffer2.201.0
jimpfile2.451.1
imagemagickfile5.852.7
gmfile13.726.2
gmbuffer13.826.3
sharpstream49.8222.6
sharpfile52.4223.8
sharpbuffer53.8324.5

解压一个 2048x1536 RGBA PNG 图像, 预乘 alpha 通道, 使用 Lanczos 3 重采样(可用时)调整大小至 720x540, 取消预乘,然后以默认 zlib 压缩级别 6 且不使用自适应过滤压缩为 PNG。

注意:jimp 不支持预乘/取消预乘。

PackageI/OOps/secSpeed-up
imagemagickfile10.371.0
gmfile13.351.3
jimpbuffer17.041.6
jimpfile17.151.7
sharpfile47.174.5
sharpbuffer47.744.6
PackageI/OOps/secSpeed-up
imagemagickfile4.391.0
gmfile9.452.2
jimpbuffer10.362.4
jimpfile10.522.4
sharpfile28.046.4
sharpbuffer28.576.5

需要 Docker。

git clone https://github.com/lovell/sharp.git
cd sharp/test/bench
./run-with-docker.sh