现代处理器具有一次处理多个字节的指令,实际上所有处理器都有一次处理 16 字节的能力,这些指令称为 SIMD(单指令多数据)。曾经存在疑问这些指令是否对加速常见任务如解析 HTML 或 JSON 有用,然而在 JSON 解析方面的工作表明 SIMD 指令确实有助于打破速度记录,如 simdjson 解析器。谷歌浏览器(Chromium)的引擎采用了 HTML 输入的 SIMD 解析,这是谷歌工程师 Anton Bikineev 的出色工作成果。
用于快速跳转到四个特定字符(<、&、\r 和 \0)的方法如下:
- 朴素方法(使用常规 C++代码):通过逐个字符检查来判断是否为特定字符。
- SIMD 方法(在 ARM 处理器上):一次处理 16 个字符,通过掩码和比较来判断是否包含特定字符。
- 在有 Intel 或 AMD 处理器的 PC 上可使用 SSE2 指令的方法:与 ARM 处理器的 SIMD 方法类似,但使用不同的指令。
- 向量化分类方法(使用 ARM NEON 指令):结合 SIMD 方法和向量表查找来分类字符,有单表查找和双表查找等版本。
对这三种技术进行比较,通过在苹果 M2 笔记本上的小基准测试(扫描谷歌首页的 HTML)得出:最简单的向量化分类例程性能最佳,即使是朴素的 SIMD 方法在该实例中也相当快,对于旧的 SSE2 PC 只有简单的 SIMD 方法可用且可能足够好。
建议阅读后续博客以了解如何更快,更新内容为 WebKit 引擎和 Chromium 采用了向量化表查找的优化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。