simdjson-java:快3倍的使用SIMD指令的JSON解析器


这是C++的simdjson的 Java 版本: 使用 SIMD 指令的 JSON 解析器,基于Geoff Langdale 和 Daniel Lemire 撰写的每秒解析千兆字节的 JSON论文 。

JSON 在互联网上随处可见。服务器花费“大量”时间来解析它。我们需要一种新的方法。simdjson C++语言库使用常用的 SIMD 指令和微并行算法,解析 JSON 的速度比 RapidJSON 快 4 倍,比现代 C++ 的 JSON 快 25 倍。

  • 快速:比常用的生产级 JSON 解析器快 4 倍以上。
  • 破纪录的功能:以 6 GB/s 的速度压缩 JSON,以 13 GB/s 的速度验证 UTF-8,以 3.5 GB/s 的速度验证 NDJSON。
  • 简单:一流、易于使用且详细记录的 API。
  • 严格:完整的 JSON 和 UTF-8 验证,无损解析。性能毫不妥协。
  • 自动:在运行时选择适合 CPU 的解析器。无需配置。
  • 可靠:从内存分配到错误处理,simdjson 的设计避免了意外。

此Java实现仍然缺少 simdsjon 中可用的几个功能。例如:

  • 支持 Unicode 字符
  • UTF-8 验证
  • 完全支持解析浮点数
  • 支持 512 位向量

使用方法:

byte[] json = loadTwitterJson();

SimdJsonParser parser = new SimdJsonParser();
JsonValue jsonValue = simdJsonParser.parse(json, json.length);
Iterator<JsonValue> tweets = jsonValue.get("statuses").arrayIterator();
while (tweets.hasNext()) {
    JsonValue tweet = tweets.next();
    JsonValue user = tweet.get("user");
    if (user.get("default_profile").asBoolean()) {
        System.out.println(user.get("screen_name").asString());
    }
}

不同 JSON 解析器的Java 库性能比较。
该基准测试使用twitter.json数据集,其目标是测量解析和查找具有默认配置文件的所有唯一用户的吞吐量(操作/秒)。

环境:

  • CPU:Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
  • 操作系统:Ubuntu 23.04,内核 6.2.0-23-generic
  • Java:OpenJDK 64 位服务器 VM Temurin-20.0.1+9

simdjson-java   :   1450.951
simdjson-java(padded):       1505.227
jackson-2.15.2   :  504.562
fastjson2.0.35    :  590.743
jsoniter- 0.9.23    :  384.664

要重现基准结果,请执行以下命令:

./gradlew jmh -Pjmh.includes='.*ParseAndSelectBenchmark.*'

simdjson基本上比传统jackson、fastjson或jsoniter快3倍!