Sukka's Blog

童话只美在真实却从不续写

  1. 1. 测试环境
  2. 2. 测试结果
    1. 2.1. Fragment Cache
    2. 2.2. Highlight.js
    3. 2.3. NodeJS Version
  3. 3. 结论

Hexo 是一款基于 NodeJS 的静态博客框架。但是随着文章越来越多,需要生成的页面数量越来越多,Hexo 也出现了性能瓶颈:在 Hexo 的 issue 页面 搜索 performance 可以找到不少关于 Hexo 性能问题的反馈。

测试环境

测试使用 300+ 篇文章,每篇文章都有 1 个分类和 5 个不同的完全不同的标签(也就是生成总计超过 300 个 categories 和 1500 个 tags),每篇文章包括所有常见 markdown 元素和多个不同语言的代码块,文章样本在这里

在性能测试前将所有 css、js 和图片文件全部删除,确保生成的文件全部都是渲染生成的 HTML 文件;所有测试都使用 hexo clean && hexo g,确保完全冷启动。

测试结果

每轮测试两次;每次 hexo clean && hexo g 都会生成 694 个文件;基准测试是最优条件:启用 Fragment Cache,完全不启用 Highlight.js。

NodeJS 8NodeJS 10NodeJS 12
Baseline26.52121.5
Disable Fragment Cache352929.5
Enable highlight.js only352727.5
Enable highlight.js & line_number383030
Enable highlight.js & tab_replace34.52728
Enable highlight.js, tab_replace & line_number383031

原始测试结果可以看 Travis CI Build Log

Fragment Cache

Fragment Cache 是 Hexo 模仿 Ruby on Rails 的思路做的缓存功能。对于一些重复且耗时的渲染进行缓存可以大大减少生成用时。

在测试中,禁用 Fragment Cache 的生成用时比基准测试增加 32%37% 左右。

Highlight.js

Hexo 内置的 Highlight.js 速度缓慢,在 Hexo 2.x 时就令人诟病,即使到了 Hexo 3.x 进行了优化,随生成用时的影响也非常明显。

在测试用,光光启用 Highlight.js(不启用其它选项)的生成用时比基准测试增加了 28%32% 左右;如果启用 Highlight.js 和 line_number,生成用时将会增加 40%43% 左右;启用 Highlight.js 和 tab_replace 生成用时将会增加 28%30%;如果同时启用上述选项,生成用时会增加 43%44%

NodeJS Version

从测试结果来看,NodeJS 8 的性能最差,NodeJS 10 和 NodeJS 12 的性能相近,NodeJS 12 略逊于 NodeJS 10。在各项测试中,NodeJS 10 和 NodeJS 12 都超过 NodeJS 8 性能将近 20%。

结论

如果把 issue 和讨论的内容归纳一下,涉及到的就是那几个方面:

禁用 Highlight.js 无疑可以大大提升渲染速度,因为如果将代码高亮做在前端,那么用户在访问的时候,浏览器需要渲染一次代码高亮;如果交给 Hexo 来渲染,就必须遍历所有文章。

除此以外可以注意到的是,即使是在最优条件下,Hexo 平均每秒钟也只能生成 33 个文件;Hexo 目前仍然是单核渲染,多核渲染可以是以后一个优化的方向。

本文作者 : Sukka
本文采用 CC BY-NC-SA 4.0 许可协议。转载和引用时请注意遵守协议!
本文链接 : https://blog.skk.moe/post/hexo-performance/

本文最后更新于 天前,文中所描述的信息可能已发生改变