问题

为什么simdjson这么快?

回答
SimdJSON 之所以速度如此之快,主要归功于以下几个关键因素的巧妙结合:

1. SIMD 指令集的高度利用:

这是 SimdJSON 的核心优势。SIMD (Single Instruction, Multiple Data) 是一种指令集扩展,允许 CPU 在一次操作中同时处理多个数据。SIMDJSON 充分利用了现代 CPU 中 AVX2 (Advanced Vector Extensions 2) 和 AVX512 等指令集。

并行处理字符: JSON 解析涉及大量的字符比较、查找和移动操作。SIMD 指令允许 SimdJSON 一次性加载 256 位(AVX2)或 512 位(AVX512)的内存数据,并对这多个字节执行相同的操作。例如,它可以一次性检查 32 个字符是否是逗号 (`,`),或者一次性查找第一个空白字符的位置。这比传统逐个字节处理要快得多。
位掩码和并行比较: SIMD 指令可以生成位掩码,快速地识别出满足特定条件的字节(例如,所有是数字的字节、所有是引号的字节)。这些位掩码可以用于并行地定位JSON结构中的关键字符,如 `{`, `}`, `[`, `]`, `:`, `,`, `"`, ``, 换行符等。
字符串查找和匹配: 传统的字符串查找算法(如 BoyerMoore)通常是顺序的。SimdJSON 利用 SIMD 优化了这些算法,使其能够并行地比较多个字节,显著加快了查找键名、值以及结构结束符的速度。

2. 预处理和状态机的高度优化:

JSON 解析本质上是一个状态机过程。SimdJSON 对这个状态机进行了深度优化:

预先计算长度和结构: SimdJSON 不仅解析 JSON,还会进行一个预处理阶段。在这个阶段,它会一次性扫描整个输入,确定字符串字面量、数字字面量、数组和对象的长度,以及它们在内存中的起始和结束位置。这个预计算步骤可以减少后续解析过程中的跳转和分支,提高缓存效率。
避免不必要的复制: 许多 JSON 解析器在处理字符串值时会进行内存复制。SimdJSON 尽可能地避免复制,而是直接使用指向原始输入数据的指针。这意味着它不需要分配新的内存,也不需要将数据复制到新的缓冲区,从而节省了时间和内存。
无回溯解析: 许多解析器在遇到不确定性时可能会回溯。SimdJSON 的设计目标是尽可能地进行无回溯解析,即一旦读取了输入,就能够确定其含义,而无需返回重新读取。这通过巧妙的状态管理和预计算来实现。

3. 对内存的优化和缓存友好性:

现代 CPU 的性能很大程度上受限于内存访问速度。SimdJSON 在内存访问方面做了大量优化:

局部性原理的应用: 通过预处理和一次性扫描,SimdJSON 尽量使CPU在处理数据时,数据尽可能地驻留在CPU缓存中。SIMD 指令一次处理多个数据,也使得缓存的利用率更高。
无分配的内存访问: 如前所述,避免不必要的内存复制意味着直接访问原始数据,减少了缓存污染和内存带宽的占用。
按块处理数据: SIMD 指令天然适合按固定大小的块(如 32 字节或 64 字节)处理数据,这与缓存行的大小相匹配,可以提高缓存命中率。

4. 对 JSON 特殊语法的巧妙处理:

JSON 的语法虽然简单,但包含一些需要特殊处理的字符和结构:

对转义字符 () 的快速查找: SimdJSON 使用 SIMD 指令快速定位转义字符 (``) 的出现,并在遇到时能够快速跳过下一个字符,而无需逐个检查。
对 Unicode 编码的支持: 尽管 JSON 主要使用 UTF8,但对 Unicode 转义序列 (`uXXXX`) 的处理也是一项挑战。SimdJSON 也对这些情况进行了优化,以高效地解码。
处理引号内的字符串: 识别字符串的边界(由双引号 `" `界定)是解析的关键。SimdJSON 使用 SIMD 指令快速查找成对的双引号,并正确处理字符串内部的转义字符。

5. 精炼的 C++ 代码和算法设计:

除了利用硬件特性,SimdJSON 的代码本身也经过了精心的设计和优化:

高度优化的 C++ 算法: 开发者使用了高度优化的 C++ 算法,充分利用了 C++ 的语言特性,如模板元编程和内联函数,以生成高效的机器码。
位运算和逻辑操作: 充分利用了位运算和逻辑操作来高效地进行状态判断和数据处理。
编译器优化: 代码的设计也充分考虑了编译器的优化能力,使得编译器能够生成更优化的机器码。

总结来说,SimdJSON 的速度优势来自于其对现代 CPU SIMD 指令集的极致利用,结合对 JSON 解析过程的深度理解和优化,包括预处理、无复制访问、缓存友好设计以及对 JSON 语法的精细处理。 它不是简单地将现有算法并行化,而是从根本上重新设计了 JSON 解析的流程,使其能够充分发挥硬件的潜力。

虽然 SimdJSON 的速度非常快,但它也可能需要更多的 CPU 资源(特别是 SIMD 指令的使用),并且在某些非常小的 JSON 文件或特定硬件上,与其他解析器之间的性能差异可能不那么显著。然而,对于大多数实际应用中遇到的较大 JSON 数据,SimdJSON 的性能优势是显而易见的。

网友意见

user avatar

代码没读,稍微看了下论文。

传统的 JSON 解析器是按字节自顶向下递归解析的,这种算法是没法并行解析的。

而 simdjson 将其分成了两步:
1. 验证字符串编码,找出所有节点的位置。
2. 验证并解析每个节点的值。
很显然,找出节点位置和解析节点值都是可以并行去做的。而 SIMD 可以让 CPU 在一条指令里同时操作多个数据,而又没有线程切换的开销,所以可以达到很高的解析速度。

实际上其他的序列化方案(如 XML、Protobuf 等)都可以利用这种思想去加速反序列化。
另外,目前这个库只支持有 AVX2 指令集的 CPU,还不支持移动设备常用的 ARM 处理器,但这只是时间问题(ARM 也是有 SIMD 的)。

更多的细节或疑问可以自己去看论文。

user avatar

最近这个SimdJson 在社区里还挺火,看来大家忍这个问题很久了。也有微软的人把它移植到了C#(用的是我给.NET Core 3.0 做的SIMD intrinsic)EgorBo/SimdJsonSharp

为什么SimdJson这么快?或者说比其他用了SIMD向量化的parser还快?

最主要的是它的思路是(现阶段)正确的:以前大多数的JSON parser 在做向量化的时候其实用的还是标量(或者叫顺序式)编程的老思路,SIMD在他们手里只是用来加速一些基本操作。比如用向量化的String.IndexOf 来加速向前搜索某个特定字符,加速跳过空白符等等。本质上还是顺序式的思想,parsing算法并没有并行化。

然而JSON parser 这种本质上的递归下降程序是很难高度SIMD并行化的,这是由于SIMD并行化的特定和parser算法的特点共同导致的:

1. 高效的SIMD并行化和GPU并行化非常相似(其实GPU就是SIMD),它要求并行数据处理之间不能有交互,或者很少有交互,才能达到最好的性能。举个例子,ray tracing 很容易用SIMD或者GPGPU并行化处理是因为每条光线的碰撞/反射/颜色表现是和其他光线没有关系的,每一个SIMD lane或者CUDA thread 可以只负责一条光线的(部分)数据计算而无需去知道其他SIMD lane或者CUDA thread 的信息。

2. Parser 在并行化时的本质不同在于它不能“独立”处理每一个数据单元(比如字符),当我们独立地看到一个引号时我们不知道怎么处理它,因为它有可能是字符串的开头,也有可能是字符串的结尾,也有可能就是一个引号(前面有转义字符),这完全取决于它前后的数据。

SimdJson的思路正确之处在于它把并行parsing问题分层处理了,即把相对容易并行的问题并行化,把难并行的问题暂时放弃,而不是眉毛胡子一把抓。具体的做法是把JSON parsing 分为了两步:

Stage 1:这步类似于普通parser 的词法分析再加上utf-8 验证。向量化验证部分不是什么新技术,创新点主要在于“词法分析”。当然JSON parsing 的词法分析有所不同,它不是把所有输入的字符数据序列化成一个个token。而是只找出对于后续parsing 重要的token。以上文提到的“引号”为例,要判断一个引号是字符串开头还是结尾显然是一件比较难并行化的任务,而判断一个引号到底是不是JSON的引号(有没有被转义)显然更简单。所以SimdJson在这步用SIMD并行查找引号前后的转义字符,然后标出真正的“引号”位置来供下一步“语法分析”使用。

Stage 2:这步类似于普通parser 的语法分析,基本没有并行化,但由于前一步已经找出了所有关键token,所以简化了算法实现了加速。

从数据来看SimdJson的效果还是不错的,C# 的简单移植也轻松击败了 .NET Core 3.0 即将推出的基于Span的新parser。但这不代表SimdJson 就没问题了,我个人觉得后续应该还有两个方面需要改进:

1. 算法上如果想要再有大的改进,stage 2 的并行化必须要做(我记得MSR好像有一篇相关的论文用类似符号执行的思想在并行单元之间传播语法信息)。因为如果还是按照当前思路一直优化stage 1 的话(比如多线程化,GPGPU化),stage 2 迟早会成为瓶颈。

2. 工程实现上,SimdJson 用的是AVX2,但我觉得AVX-512 其实天然得更适合这个算法。AVX-512 的mask register机制可以显著简化stage 1 中的mask 生成/提取/计算。

类似的话题

  • 回答
    SimdJSON 之所以速度如此之快,主要归功于以下几个关键因素的巧妙结合:1. SIMD 指令集的高度利用:这是 SimdJSON 的核心优势。SIMD (Single Instruction, Multiple Data) 是一种指令集扩展,允许 CPU 在一次操作中同时处理多个数据。SIMDJ.............
  • 回答
    近年来,自由主义在全球范围内的影响力确实呈现出明显的衰落趋势,这一现象涉及经济、政治、社会、技术、文化等多个层面的复杂互动。以下从多个维度详细分析自由主义衰落的原因: 一、经济全球化与贫富差距的加剧1. 自由主义经济政策的局限性 自由主义经济学强调市场自由、私有化、减少政府干预,但其在21世.............
  • 回答
    俄乌战争期间,虚假信息(假消息)的传播确实非常广泛,其背后涉及复杂的国际政治、媒体运作、技术手段和信息战策略。以下从多个角度详细分析这一现象的成因: 1. 信息战的直接动因:大国博弈与战略竞争俄乌战争本质上是俄罗斯与西方国家(尤其是美国、北约)之间的地缘政治冲突,双方在信息领域展开激烈竞争: 俄罗斯.............
  • 回答
    政府与军队之间的关系是一个复杂的政治与军事体系问题,其核心在于权力的合法性和制度性约束。虽然政府本身可能不直接持有武器,但通过法律、组织结构、意识形态和历史传统,政府能够有效指挥拥有武器的军队。以下是详细分析: 一、法律授权与国家主权1. 宪法与法律框架 政府的权力来源于国家宪法或法律。例如.............
  • 回答
    关于“传武就是杀人技”的说法,这一观点在历史、文化和社会语境中存在一定的误解和偏见。以下从历史、文化、现代演变和误解来源等多个角度进行详细分析: 一、历史背景:武术的原始功能与社会角色1. 自卫与生存需求 中国传统武术(传武)的起源与农耕社会、游牧民族的生存环境密切相关。在古代,武术的核心功.............
  • 回答
    关于近代历史人物是否能够“翻案”的问题,需要结合历史背景、人物行为对国家和民族的影响,以及历史评价的客观性进行分析。袁世凯和汪精卫作为中国近代史上的重要人物,其历史评价确实存在复杂性和争议性,但“不能翻案”的结论并非基于单一因素,而是综合历史、政治、道德等多方面考量的结果。以下从历史背景、人物行为、.............
  • 回答
    关于“俄爹”这一称呼,其来源和含义需要从多个角度分析,同时要明确其不尊重的性质,并指出如何正确回应。以下是详细解析和反驳思路: 一、称呼的来源与可能的含义1. 可能的字面拆解 “俄”是“俄罗斯”的拼音首字,而“爹”在中文中通常指父亲,带有亲昵或戏谑的意味。 若将两者结合,可能暗示.............
  • 回答
    民国时期(19121949)虽然仅持续约37年,却涌现出大量在文学、艺术、科学、政治、哲学等领域具有划时代意义的“大师级人物”。这一现象的出现,是多重历史、社会、文化因素共同作用的结果。以下从多个维度进行详细分析: 一、思想解放与文化启蒙的浪潮1. 新文化运动(19151923) 思想解放.............
  • 回答
    航空航天领域在待遇和职业环境上确实存在一定的挑战,但国家在该领域取得的飞速发展,主要源于多方面的国家战略、技术积累和系统性支持。以下从多个维度详细分析这一现象: 一、国家战略与长期投入:推动技术突破的核心动力1. 国家层面的战略目标 航空航天技术往往与国家的科技竞争力、国家安全和国际地位密切.............
  • 回答
    吴京作为中国知名演员、导演,近年来因《战狼2》《英雄联盟》等作品及个人生活引发公众关注,其形象和言论在不同语境下存在争议,导致部分人对其产生负面评价。以下从多个角度详细分析可能的原因: 1. 个人生活与公众形象的冲突 妻子被曝光:2018年,吴京妻子的近照和视频被网友扒出,引发舆论争议。部分人.............
  • 回答
    近年来,全球范围内对乌克兰的支持确实呈现出显著增加的趋势,这一现象涉及多重因素,包括国际局势、地缘政治博弈、信息传播、经济援助、民族主义情绪以及国际社会的集体反应。以下从多个角度详细分析这一现象的成因: 1. 俄乌战争的爆发与国际社会的集体反应 战争的爆发:2022年2月,俄罗斯对乌克兰发动全面入侵.............
  • 回答
    《是大臣》《是首相》等政治剧之所以能在编剧缺乏公务员经历的情况下取得成功,主要源于以下几个关键因素的综合作用: 1. 构建政治剧的底层逻辑:制度与权力的结构性认知 政治体制的系统性研究:编剧可能通过大量研究英国议会制度、政府运作流程、政党政治规则(如议会制、内阁制、党鞭系统等)来构建剧情。例如.............
  • 回答
    关于“剧组中男性可以坐镜头箱而女性不能”的现象,这一说法可能存在误解或过度泛化的倾向。在影视拍摄中,镜头箱(通常指摄影机或固定设备)与演员的性别并无直接关联,但若涉及性别差异的讨论,可能与以下多方面因素相关: 1. 传统性别刻板印象的延续 历史背景:在传统影视文化中,男性常被赋予主导、主动的角.............
  • 回答
    印度在俄乌战争中不公开表态、在安理会投票中对俄罗斯的决议案弃权,这一行为背后涉及复杂的地缘政治、经济利益和外交策略考量。以下是详细分析: 1. 与俄罗斯的经济与军事合作 能源依赖:印度是俄罗斯的重要能源进口国,2022年俄乌战争爆发后,印度从俄罗斯进口了大量石油和天然气,以缓解对西方能源的依赖。尽管.............
  • 回答
    关于“公知”与高校知识分子的关系,这一现象涉及中国社会、教育体系、媒体环境以及知识分子角色的多重因素。以下从多个维度进行分析: 一、高校知识分子的特殊性1. 教育背景与专业素养 高校知识分子通常拥有高等教育背景,具备较强的知识储备和批判性思维能力。这种专业素养使他们更倾向于参与公共讨论,尤其.............
  • 回答
    短视频平台在字幕中对“死”“钱”“血”等字打上马赛克,主要出于以下几方面的考虑,涉及内容监管、文化规范、法律合规和平台运营策略: 1. 避免敏感内容传播这些字可能与以下敏感话题相关,平台通过屏蔽来防止违规内容扩散: “死”:可能涉及自杀、死亡、濒死等话题,容易引发负面情绪或被用于极端内容(如自杀教程.............
  • 回答
    素食主义作为一项社会运动,其发展与传播确实涉及复杂的动机和行为逻辑。从现象学角度分析,素食主义者的“带节奏”行为可能源于以下几个层面的原因和目的: 一、社会运动的传播逻辑1. 信息传播的网络效应 在社交媒体时代,素食主义者通过短视频、直播、图文等形式形成信息扩散链。例如,YouTube上"V.............
  • 回答
    伊朗的伊斯兰革命(1979年)是20世纪最重大的政治事件之一,其爆发和“逆世俗化”趋势的形成,是多重历史、社会、经济和宗教因素交织的结果。以下从多个维度详细分析这一现象的成因: 一、历史背景:波斯帝国的衰落与殖民影响1. 波斯帝国的遗产 波斯帝国(公元前550年)曾是中东最强大的帝国之一,以.............
  • 回答
    伊尔96(Il96)和图204(Tu204)是苏联和俄罗斯在20世纪80至20世纪初研制的中短程宽体客机,但它们在国际航空市场上的表现并不理想,主要原因涉及技术、经济、政治、市场和竞争等多个层面。以下从多个角度详细分析其销路不佳的原因: 1. 技术性能不足:无法满足现代市场需求 伊尔96(1970年.............
  • 回答
    您的问题可能存在一些误解或翻译错误。实际上,飞机和高铁都需要乘客,两者都是用于运输乘客的交通工具,只是在技术、运行方式和应用场景上有显著差异。以下是详细解释: 1. 高铁和飞机都需要乘客 高铁:中国高铁(如京沪高铁、京广高铁)是高速铁路系统,主要用于短途和中长途客运,乘客数量庞大,是国家重要的交通方.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有