使用 SIMD 指令更快地扫描 HTML(C++ 和 C#)–丹尼尔·莱米尔的博客

主要观点:今年初主要网络引擎(WebKit/Safari 和 Chromium/Chrome/Edge/Brave)利用 SIMD 指令加速 HTML 解析,WebKit 和 Chromium 解决的问题是尽快跳转到下一个目标字符,如<、&、\r 和\0,最初使用 std::find_first_of 或 SearchValues 类,后采用向量化分类,文中还介绍了类似 simdjson 的方法及用 C++和 C#实现的代码结构,并通过基准测试比较了不同方法的速度和指令效率。
关键信息

  • SIMD 指令可同时处理多个字节,如 16 字节。
  • WebKit 和 Chromium 工程师使用向量化分类,加载字节块并识别目标字符。
  • 介绍了用于解决问题的 C++结构,包括构造函数和相关方法,更新函数较复杂。
  • 用 C++基准测试比较了 find_first_of、向量分类和 64 位向量分类的速度和指令效率。
  • C#中也比较了常规方法、SearchValues 类和向量分类及 64 位向量分类的速度。
    重要细节
  • 在 C++中,构造函数初始化 neon_match64 对象,通过多个方法实现对目标字符的处理。
  • 基准测试在 Apple M2 笔记本上进行,给出了不同方法的速度等数据。
  • C#代码在 Arseniy Zlobintsev 的帮助下进行了移植。
  • 未移植 x64 处理器代码,但预计有良好结果。
阅读 11
0 条评论