Skip to content

Instantly share code, notes, and snippets.

@syusui-s
Last active November 30, 2025 08:40
Show Gist options
  • Select an option

  • Save syusui-s/0e8a78e9d94edb505c034449b08fc945 to your computer and use it in GitHub Desktop.

Select an option

Save syusui-s/0e8a78e9d94edb505c034449b08fc945 to your computer and use it in GitHub Desktop.

simdjson vs fastjson2 ベンチマーク比較

java-json-benchmarkリポジトリを使用して、simdjsonとfastjson2のデシリアライゼーション性能を比較しました。

実験環境

実行時の注意点

simdjson

メモリ消費が大きく、特別な設定が必要でした:

ヒープサイズ: デフォルトの2GBでは不足。8コアで4GB、16並列では8GBが必要だった。

# run.sh
HEAP_SIZE=8g

プロセッサ数の制限: 物理コア数に合わせることでパフォーマンスが向上

# run.shのJVM_OPTIONSに追加
JVM_OPTIONS="... -XX:ActiveProcessorCount=8 ..."

fastjson2

  • デフォルトの2GB ヒープで問題なく動作
  • 16論理コアをフル活用可能
  • 8コア制限下でもsimdjsonほどのパフォーマンスは出ない

コア数制限を試した経緯

simdjson側が公表しているベンチマークではfastjsonより高速という結果だったため、 当初の結果(16論理コア使用時: 3.83M ops/s)に疑問を持ちました。

Ryzen 7840UはSMTで16論理コアとして動作しますが、AVXユニットは16個も存在しないのではないか、と予想。 物理コア数(8コア)に制限することで、AVX演算の競合を減らせるのではないかと考えました。

ベンチマーク結果

ライブラリ Cores Freq スループット (ops/s)
genson 16 perf. 1,128,122 ± 37642
jackson 16 perf. 1,658,420 ± 15766
dsljson 16 perf. 2,893,104 ± 31206
dsljson_reflection 16 perf. 2,198,903 ± 27473
simdjson_java 16 perf. 3,833,938 ± 15767
fastjson 16 perf. 4,138,670 ± 19843
simdjson_java 4 perf. 4,228,663 ± 14347
fastjson_features 16 perf. 4,985,441 ± 13624
fastjson 16 3GHz 6,028,876 ± 78994
fastjson_features 16 3GHz 6,439,802 ± 68120
simdjson_java 8 perf. 6,640,664 ± 20034
simdjson_java 9 perf. 7,401,863 ± 14816
simdjson_java 9 3GHz 9,608,024 ± 60567
  • Cores:
    • -XX:ActiveProcessorCount=${CORES}
    • JMHでは ActiveProcessorCount - 1 のスレッドで処理
  • Freq:
    • pref.: Use performance governor within 400 MHz - 5.13 GHz range
      • sudo cpupower frequency-set -g performance
    • 3GHz: Use performance governor within 3.00 GHz - 3.00 GHz range

考察

AVX演算の競合について

予想通り、AVXユニットの排他的使用によるパフォーマンス低下が確認できました:

  • 8スレッドでは6.64M ops/sを達成
  • 15スレッドに増やすと3.83M ops/sに低下
  • 更に周波数スケーリングを避けるために 3GHz に設定したところ、パフォーマンスが向上
  • Ryzen 7840UはSMT有効時、1つの物理コアに2つの論理コアが割り当てられるが、AVXユニットは共有される
  • Vector APIベースのsimdjsonでは、複数スレッドが同一物理コア上でAVX命令を実行しようとすると、ブロッキングが発生して性能が悪化

パフォーマンススケーリング

  • 4コア: 4.23M ops/s
  • 8コア: 6.64M ops/s (約1.57倍)
  • 16コア: 3.83M ops/s (8コアから42%低下)

理想的には8コアで2倍になるはずですが、1.57倍に留まっており、何らかのボトルネックが存在する可能性があります。

考慮事項・今後の検証

クラウド環境での懸念

EC2やVPSのような複数の仮想マシンがCPUを共用する環境では、SIMD命令の有効性が不透明です:

  • 他のVMがSIMD命令を使用していると、パフォーマンスが低下する可能性
  • クラウド環境での実ベンチマークが必要

Zen 4アーキテクチャでの可能性

Zen 4では1コアあたりAVXユニットが2個搭載されているとの情報があります:

  • AVX-256を活用すれば、並列度を上げてもパフォーマンス低下を抑えられる可能性
  • まだ検証できていないため、今後の課題

主な知見

  1. 最高性能: simdjson (8物理コア設定) が 6.64M ops/s で最速
  2. fastjson2: features有効時で 4.99M ops/s。simdjsonの約75%の性能
  3. SMTの落とし穴: SIMD集約的なワークロードでは、論理コア数を増やすと逆効果
  4. リソース効率: fastjson2の方がメモリ使用量が少なく、デフォルト設定で安定動作

結論

性能を最優先し、物理コア数の制約を適切に設定できる環境ではsimdjsonが有利です。ただし、以下のトレードオフを考慮する必要があります:

  • simdjsonは高速だが、メモリ消費が大きく、ハードウェア特性に応じたチューニングが必須
  • fastjson2は若干遅いものの、リソース効率が良く、デフォルト設定で安定動作し、SMTを活かせる
  • 実運用では、メモリ制約、チューニングコスト、クラウド環境での挙動も考慮すべき
+ exec java -server -Xms8g -Xmx8g --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector -jar build/libs/app.jar deser --libs simdjson_java
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: java/temurin-25.0.1+8.0.LTS/bin/java
# VM options: -Xms8g -Xmx8g --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 15 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.databind.Deserialization.simdjson_java
# Run progress: 0.00% complete, ETA 00:02:40
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=7603 as seed for Random
48.452 ops/s
# Warmup Iteration 2: 50.013 ops/s
# Warmup Iteration 3: 52.857 ops/s
# Warmup Iteration 4: 52.348 ops/s
# Warmup Iteration 5: 52.800 ops/s
Iteration 1: 52.412 ops/s
Iteration 2: 52.643 ops/s
Iteration 3: 53.267 ops/s
Iteration 4: 51.800 ops/s
Iteration 5: 52.520 ops/s
Iteration 6: 52.829 ops/s
Iteration 7: 53.322 ops/s
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: /opt/java/openjdk/bin/java
# VM options: -Xms2g -Xmx2g --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 15 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.stream.Deserialization.genson
# Run progress: 0.00% complete, ETA 00:05:20
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=226099020233603 as seed for Random
1123848.110 ops/s
# Warmup Iteration 2: 1126721.766 ops/s
# Warmup Iteration 3: 979510.456 ops/s
# Warmup Iteration 4: 964018.769 ops/s
# Warmup Iteration 5: 1133510.767 ops/s
Iteration 1: 1117746.621 ops/s
Iteration 2: 1146348.286 ops/s
Iteration 3: 1140385.108 ops/s
Iteration 4: 1116751.830 ops/s
Iteration 5: 1141940.490 ops/s
Iteration 6: 1074275.134 ops/s
Iteration 7: 1098494.902 ops/s
Iteration 8: 1149775.824 ops/s
Iteration 9: 1190300.120 ops/s
Iteration 10: 1167150.049 ops/s
# Run progress: 25.00% complete, ETA 00:04:02
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=226179745730801 as seed for Random
1200853.017 ops/s
# Warmup Iteration 2: 1221612.006 ops/s
# Warmup Iteration 3: 1145691.907 ops/s
# Warmup Iteration 4: 1139942.069 ops/s
# Warmup Iteration 5: 1222911.220 ops/s
Iteration 1: 1195810.872 ops/s
Iteration 2: 1074981.208 ops/s
Iteration 3: 1070975.116 ops/s
Iteration 4: 1131804.183 ops/s
Iteration 5: 1178640.829 ops/s
Iteration 6: 1148645.692 ops/s
Iteration 7: 1096737.807 ops/s
Iteration 8: 1032782.469 ops/s
Iteration 9: 1165556.537 ops/s
Iteration 10: 1123331.316 ops/s
Result "com.github.fabienrenaud.jjb.stream.Deserialization.genson":
1128121.720 ±(99.9%) 37642.173 ops/s [Average]
(min, avg, max) = (1032782.469, 1128121.720, 1195810.872), stdev = 43348.782
CI (99.9%): [1090479.547, 1165763.893] (assumes normal distribution)
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: /opt/java/openjdk/bin/java
# VM options: -Xms2g -Xmx2g --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 15 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.stream.Deserialization.jackson
# Run progress: 50.00% complete, ETA 00:02:41
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=226260499314496 as seed for Random
1414040.936 ops/s
# Warmup Iteration 2: 1569451.629 ops/s
# Warmup Iteration 3: 1625379.589 ops/s
# Warmup Iteration 4: 1601839.608 ops/s
# Warmup Iteration 5: 1596174.827 ops/s
Iteration 1: 1590812.854 ops/s
Iteration 2: 1631915.479 ops/s
Iteration 3: 1514438.755 ops/s
Iteration 4: 1385878.148 ops/s
Iteration 5: 1295453.350 ops/s
Iteration 6: 1348609.261 ops/s
Iteration 7: 1511415.276 ops/s
Iteration 8: 1565136.815 ops/s
Iteration 9: 1574774.694 ops/s
Iteration 10: 1580485.241 ops/s
# Run progress: 75.00% complete, ETA 00:01:20
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=226341226283084 as seed for Random
1790446.050 ops/s
# Warmup Iteration 2: 1781710.508 ops/s
# Warmup Iteration 3: 1810655.655 ops/s
# Warmup Iteration 4: 1787395.623 ops/s
# Warmup Iteration 5: 1809503.989 ops/s
Iteration 1: 1827102.405 ops/s
Iteration 2: 1808196.604 ops/s
Iteration 3: 1836875.861 ops/s
Iteration 4: 1813274.593 ops/s
Iteration 5: 1847584.134 ops/s
Iteration 6: 1779182.412 ops/s
Iteration 7: 1792621.515 ops/s
Iteration 8: 1824540.749 ops/s
Iteration 9: 1821205.968 ops/s
Iteration 10: 1818885.987 ops/s
Result "com.github.fabienrenaud.jjb.stream.Deserialization.jackson":
1658419.505 ±(99.9%) 157660.069 ops/s [Average]
(min, avg, max) = (1295453.350, 1658419.505, 1847584.134), stdev = 181561.570
CI (99.9%): [1500759.436, 1816079.574] (assumes normal distribution)
# Run complete. Total time: 00:05:22
REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on
why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial
experiments, perform baseline and negative tests that provide experimental control, make sure
the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts.
Do not assume the numbers tell you what you want them to tell.
NOTE: Current JVM experimentally supports Compiler Blackholes, and they are in use. Please exercise
extra caution when trusting the results, look into the generated code to check the benchmark still
works, and factor in a small probability of new VM bugs. Additionally, while comparisons between
different JVMs are already problematic, the performance difference caused by different Blackhole
modes can be very significant. Please make sure you use the consistent Blackhole mode for comparisons.
Benchmark Mode Cnt Score Error Units
Deserialization.genson thrpt 20 1128121.720 ± 37642.173 ops/s
Deserialization.jackson thrpt 20 1658419.505 ± 157660.069 ops/s
--------------------------------------------
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: /opt/java/openjdk/bin/java
# VM options: -Xms2g -Xmx2g --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 15 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.databind.Deserialization.dsljson
# Run progress: 0.00% complete, ETA 00:10:40
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=226504869823065 as seed for Random
2489730.381 ops/s
# Warmup Iteration 2: 2562949.386 ops/s
# Warmup Iteration 3: 2572595.346 ops/s
# Warmup Iteration 4: 2527922.890 ops/s
# Warmup Iteration 5: 2550840.785 ops/s
Iteration 1: 2562146.117 ops/s
Iteration 2: 2531853.735 ops/s
Iteration 3: 2559795.858 ops/s
Iteration 4: 2558190.285 ops/s
Iteration 5: 2512004.411 ops/s
Iteration 6: 2506637.015 ops/s
Iteration 7: 2549417.252 ops/s
Iteration 8: q2547765.621 ops/s
Iteration 9:2561045.764 ops/s
Iteration 10: 2544303.183 ops/s
# Run progress: 12.50% complete, ETA 00:09:24
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=226585537418122 as seed for Random
3048185.723 ops/s
# Warmup Iteration 2: 2984185.458 ops/s
# Warmup Iteration 3: 3001986.039 ops/s
# Warmup Iteration 4: 3228530.339 ops/s
# Warmup Iteration 5: 3240781.154 ops/s
Iteration 1: 3221440.926 ops/s
Iteration 2: 3245526.203 ops/s
Iteration 3: 3264807.171 ops/s
Iteration 4: 3218296.996 ops/s
Iteration 5: 3219979.058 ops/s
Iteration 6: 3252943.988 ops/s
Iteration 7: 3254511.527 ops/s
Iteration 8: 3256049.402 ops/s
Iteration 9: 3263848.501 ops/s
Iteration 10: 3231507.439 ops/s
Result "com.github.fabienrenaud.jjb.databind.Deserialization.dsljson":
2893103.523 ±(99.9%) 312059.186 ops/s [Average]
(min, avg, max) = (2506637.015, 2893103.523, 3264807.171), stdev = 359367.823
CI (99.9%): [2581044.336, 3205162.709] (assumes normal distribution)
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: /opt/java/openjdk/bin/java
# VM options: -Xms2g -Xmx2g --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 15 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.databind.Deserialization.dsljson_reflection
# Run progress: 25.00% complete, ETA 00:08:03
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=226666201102960 as seed for Random
2052864.993 ops/s
# Warmup Iteration 2: 2192529.617 ops/s
# Warmup Iteration 3: 2191077.842 ops/s
# Warmup Iteration 4: 2176629.373 ops/s
# Warmup Iteration 5: 2180808.295 ops/s
Iteration 1: 2204160.542 ops/s
Iteration 2: 2230441.565 ops/s
Iteration 3: 2235282.918 ops/s
Iteration 4: 2229251.940 ops/s
Iteration 5: 2211464.895 ops/s
Iteration 6: 2237711.682 ops/s
Iteration 7: 2248900.935 ops/s
Iteration 8: 2250202.267 ops/s
Iteration 9: 2222474.856 ops/s
Iteration 10: 2146165.019 ops/s
# Run progress: 37.50% complete, ETA 00:06:43
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=226746861599036 as seed for Random
2019987.761 ops/s
# Warmup Iteration 2: 2167269.631 ops/s
# Warmup Iteration 3: 2160930.711 ops/s
# Warmup Iteration 4: 2158665.565 ops/s
# Warmup Iteration 5: 2131361.355 ops/s
Iteration 1: 2183546.914 ops/s
Iteration 2: 2170058.285 ops/s
Iteration 3: 2170388.429 ops/s
Iteration 4: 2165636.563 ops/s
Iteration 5: 2176451.457 ops/s
Iteration 6: 2186537.365 ops/s
Iteration 7: 2179022.971 ops/s
Iteration 8: 2168286.270 ops/s
Iteration 9: 2179652.305 ops/s
Iteration 10: 2182430.333 ops/s
Result "com.github.fabienrenaud.jjb.databind.Deserialization.dsljson_reflection":
2198903.375 ±(99.9%) 27472.983 ops/s [Average]
(min, avg, max) = (2146165.019, 2198903.375, 2250202.267), stdev = 31637.928
CI (99.9%): [2171430.392, 2226376.359] (assumes normal distribution)
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: /opt/java/openjdk/bin/java
# VM options: -Xms2g -Xmx2g --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 15 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.databind.Deserialization.fastjson
# Run progress: 50.00% complete, ETA 00:05:22
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=226827550446595 as seed for Random
4268216.654 ops/s
# Warmup Iteration 2: 4434692.677 ops/s
# Warmup Iteration 3: 4428246.432 ops/s
# Warmup Iteration 4: 4426832.498 ops/s
# Warmup Iteration 5: 4401909.487 ops/s
Iteration 1: 4424217.703 ops/s
Iteration 2: 4386151.894 ops/s
Iteration 3: 4367999.205 ops/s
Iteration 4: 4244222.393 ops/s
Iteration 5: 4391344.632 ops/s
Iteration 6: 4284292.528 ops/s
Iteration 7: 4312137.689 ops/s
Iteration 8: 4408319.082 ops/s
Iteration 9: 4369219.961 ops/s
Iteration 10: 4389966.015 ops/s
# Run progress: 62.50% complete, ETA 00:04:02
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=226908211295689 as seed for Random
3796537.856 ops/s
# Warmup Iteration 2: 3927625.893 ops/s
# Warmup Iteration 3: 3918046.594 ops/s
# Warmup Iteration 4: 3917066.127 ops/s
# Warmup Iteration 5: 3928385.072 ops/s
Iteration 1: 3933787.174 ops/s
Iteration 2: 3910768.157 ops/s
Iteration 3: 3915849.553 ops/s
Iteration 4: 3894645.086 ops/s
Iteration 5: 3917757.506 ops/s
Iteration 6: 3911091.612 ops/s
Iteration 7: 3935616.255 ops/s
Iteration 8: 3928938.060 ops/s
Iteration 9: 3923785.594 ops/s
Iteration 10: 3923288.216 ops/s
Result "com.github.fabienrenaud.jjb.databind.Deserialization.fastjson":
4138669.916 ±(99.9%) 198432.411 ops/s [Average]
(min, avg, max) = (3894645.086, 4138669.916, 4424217.703), stdev = 228515.059
CI (99.9%): [3940237.505, 4337102.326] (assumes normal distribution)
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: /opt/java/openjdk/bin/java
# VM options: -Xms2g -Xmx2g --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 15 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.databind.Deserialization.fastjson_features
# Run progress: 75.00% complete, ETA 00:02:41
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=226988892731074 as seed for Random
4985307.468 ops/s
# Warmup Iteration 2: 5165864.545 ops/s
# Warmup Iteration 3: 5130414.917 ops/s
# Warmup Iteration 4: 5070500.189 ops/s
# Warmup Iteration 5: 5081286.880 ops/s
Iteration 1: 5106739.450 ops/s
Iteration 2: 5093911.610 ops/s
Iteration 3: 5044995.477 ops/s
Iteration 4: 5134412.978 ops/s
Iteration 5: 5141269.344 ops/s
Iteration 6: 5164750.009 ops/s
Iteration 7: 5172104.417 ops/s
Iteration 8: 5166030.521 ops/s
Iteration 9: 5164354.819 ops/s
Iteration 10: 5167494.434 ops/s
# Run progress: 87.50% complete, ETA 00:01:20
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/app/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=227069543678698 as seed for Random
4661919.763 ops/s
# Warmup Iteration 2: 4814937.705 ops/s
# Warmup Iteration 3: 4813070.080 ops/s
# Warmup Iteration 4: 4817970.555 ops/s
# Warmup Iteration 5: 4817238.213 ops/s
Iteration 1: 4822191.106 ops/s
Iteration 2: 4819915.279 ops/s
Iteration 3: 4831767.574 ops/s
Iteration 4: 4826044.502 ops/s
Iteration 5: 4850385.609 ops/s
Iteration 6: 4838431.832 ops/s
Iteration 7: 4840835.263 ops/s
Iteration 8: 4838614.403 ops/s
Iteration 9: 4838100.510 ops/s
Iteration 10: 4846475.438 ops/s
Result "com.github.fabienrenaud.jjb.databind.Deserialization.fastjson_features":
4985441.229 ±(99.9%) 136236.428 ops/s [Average]
(min, avg, max) = (4819915.279, 4985441.229, 5172104.417), stdev = 156890.073
CI (99.9%): [4849204.801, 5121677.657] (assumes normal distribution)
# Run complete. Total time: 00:10:45
REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on
why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial
experiments, perform baseline and negative tests that provide experimental control, make sure
the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts.
Do not assume the numbers tell you what you want them to tell.
NOTE: Current JVM experimentally supports Compiler Blackholes, and they are in use. Please exercise
extra caution when trusting the results, look into the generated code to check the benchmark still
works, and factor in a small probability of new VM bugs. Additionally, while comparisons between
different JVMs are already problematic, the performance difference caused by different Blackhole
modes can be very significant. Please make sure you use the consistent Blackhole mode for comparisons.
Benchmark Mode Cnt Score Error Units
Deserialization.dsljson thrpt 20 2893103.523 ± 312059.186 ops/s
Deserialization.dsljson_reflection thrpt 20 2198903.375 ± 27472.983 ops/s
Deserialization.fastjson thrpt 20 4138669.916 ± 198432.411 ops/s
Deserialization.fastjson_features thrpt 20 4985441.229 ± 136236.428 ops/s
--------------------------------------------
4 cores
Benchmark Mode Cnt Score Error Units
Deserialization.simdjson_java thrpt 20 4228663.147 ± 143467.242 ops/s
--------------------------------------------
8 core (physical cores)
SHADOW=No HEAP_SIZE=8g ./run deser --libs simdjson_java
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: java/temurin-25.0.1+8.0.LTS/bin/java
# VM options: -Xms8g -Xmx8g -XX:ActiveProcessorCount=8 --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 7 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.databind.Deserialization.simdjson_java
# Run progress: 0.00% complete, ETA 00:02:40
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
6556013.036 ops/s
# Warmup Iteration 2: 6554993.696 ops/s
# Warmup Iteration 3: 6694695.173 ops/s
# Warmup Iteration 4: 6643725.018 ops/s
# Warmup Iteration 5: 6924448.492 ops/s
Iteration 1: 6731588.935 ops/s
Iteration 2: 6905731.273 ops/s
Iteration 3: 6854066.978 ops/s
Iteration 4: 6874406.590 ops/s
Iteration 5: 6950944.195 ops/s
Iteration 6: 6865122.457 ops/s
Iteration 7: 6862208.567 ops/s
Iteration 8: 6719313.928 ops/s
Iteration 9: 6890300.415 ops/s
Iteration 10: 6840153.140 ops/s
# Run progress: 50.00% complete, ETA 00:01:20
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
5644286.210 ops/s
# Warmup Iteration 2: 6305794.973 ops/s
# Warmup Iteration 3: 6496892.449 ops/s
# Warmup Iteration 4: 6566530.838 ops/s
# Warmup Iteration 5: 6587997.736 ops/s
Iteration 1: 6516721.713 ops/s
Iteration 2: 6555063.070 ops/s
Iteration 3: 6365507.005 ops/s
Iteration 4: 6453880.794 ops/s
Iteration 5: 6429711.245 ops/s
Iteration 6: 6271936.020 ops/s
Iteration 7: 6452004.041 ops/s
Iteration 8: 6537047.486 ops/s
Iteration 9: 6470408.099 ops/s
Iteration 10: 6267157.715 ops/s
Result "com.github.fabienrenaud.jjb.databind.Deserialization.simdjson_java":
6640663.683 ±(99.9%) 200338.384 ops/s [Average]
(min, avg, max) = (6267157.715, 6640663.683, 6950944.195), stdev = 230709.981
CI (99.9%): [6440325.300, 6841002.067] (assumes normal distribution)
# Run complete. Total time: 00:02:41
REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on
why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial
experiments, perform baseline and negative tests that provide experimental control, make sure
the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts.
Do not assume the numbers tell you what you want them to tell.
NOTE: Current JVM experimentally supports Compiler Blackholes, and they are in use. Please exercise
extra caution when trusting the results, look into the generated code to check the benchmark still
works, and factor in a small probability of new VM bugs. Additionally, while comparisons between
different JVMs are already problematic, the performance difference caused by different Blackhole
modes can be very significant. Please make sure you use the consistent Blackhole mode for comparisons.
Benchmark Mode Cnt Score Error Units
Deserialization.simdjson_java thrpt 20 6640663.683 ± 200338.384 ops/s
--------------------------------------------
* `-XX:ActiveProcessorCount=9`
* CPU governer=performance
* 8GB
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: java/temurin-25.0.1+8.0.LTS/bin/java
# VM options: -Xms8g -Xmx8g -XX:ActiveProcessorCount=9 --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 8 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.databind.Deserialization.simdjson_java
# Run progress: 0.00% complete, ETA 00:02:40
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
7634657.717 ops/s
# Warmup Iteration 2: 7717144.883 ops/s
# Warmup Iteration 3: 7574951.431 ops/s
# Warmup Iteration 4: 7641847.380 ops/s
# Warmup Iteration 5: 7629193.168 ops/s
Iteration 1: 7636327.513 ops/s
Iteration 2: 7604405.494 ops/s
Iteration 3: 7565677.887 ops/s
Iteration 4: 7576297.734 ops/s
Iteration 5: 7562284.918 ops/s
Iteration 6: 7531483.678 ops/s
Iteration 7: 7596029.083 ops/s
Iteration 8: 7574887.919 ops/s
Iteration 9: 7520948.699 ops/s
Iteration 10: 7485588.308 ops/s
# Run progress: 50.00% complete, ETA 00:01:20
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
7597009.825 ops/s
# Warmup Iteration 2: 7409920.017 ops/s
# Warmup Iteration 3: 7276180.018 ops/s
# Warmup Iteration 4: 7277566.649 ops/s
# Warmup Iteration 5: 7250473.679 ops/s
Iteration 1: 7260266.913 ops/s
Iteration 2: 7229395.746 ops/s
Iteration 3: 7234073.819 ops/s
Iteration 4: 7219314.691 ops/s
Iteration 5: 7240491.514 ops/s
Iteration 6: 7246048.329 ops/s
Iteration 7: 7239088.148 ops/s
Iteration 8: 7244117.771 ops/s
Iteration 9: 7232397.675 ops/s
Iteration 10: 7238139.060 ops/s
Result "com.github.fabienrenaud.jjb.databind.Deserialization.simdjson_java":
7401863.245 ±(99.9%) 148159.855 ops/s [Average]
(min, avg, max) = (7219314.691, 7401863.245, 7636327.513), stdev = 170621.110
CI (99.9%): [7253703.389, 7550023.100] (assumes normal distribution)
# Run complete. Total time: 00:02:41
REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on
why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial
experiments, perform baseline and negative tests that provide experimental control, make sure
the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts.
Do not assume the numbers tell you what you want them to tell.
NOTE: Current JVM experimentally supports Compiler Blackholes, and they are in use. Please exercise
extra caution when trusting the results, look into the generated code to check the benchmark still
works, and factor in a small probability of new VM bugs. Additionally, while comparisons between
different JVMs are already problematic, the performance difference caused by different Blackhole
modes can be very significant. Please make sure you use the consistent Blackhole mode for comparisons.
Benchmark Mode Cnt Score Error Units
Deserialization.simdjson_java thrpt 20 7401863.245 ± 148159.855 ops/s
--------------------------------------------
* -XX:ActiveProcessorCount=9
* 3GHz CPU `for i in `seq 0 15`; do sudo cpupower -c "$i" frequency-set --min 3G --max 3G; done`
* fan disangaged
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: java/temurin-25.0.1+8.0.LTS/bin/java
# VM options: -Xms8g -Xmx8g -XX:ActiveProcessorCount=9 --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 8 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.databind.Deserialization.simdjson_java
# Run progress: 0.00% complete, ETA 00:02:40
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
8801837.862 ops/s
# Warmup Iteration 2: 9354561.772 ops/s
# Warmup Iteration 3: 9462242.125 ops/s
# Warmup Iteration 4: 9557821.388 ops/s
# Warmup Iteration 5: 9535237.722 ops/s
Iteration 1: 9516837.131 ops/s
Iteration 2: 9481222.297 ops/s
Iteration 3: 9513130.309 ops/s
Iteration 4: 9574531.323 ops/s
Iteration 5: 9579163.068 ops/s
Iteration 6: 9587992.473 ops/s
Iteration 7: 9589909.758 ops/s
Iteration 8: 9591677.030 ops/s
Iteration 9: 9575029.826 ops/s
Iteration 10: 9603307.328 ops/s
# Run progress: 50.00% complete, ETA 00:01:20
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
8551747.323 ops/s
# Warmup Iteration 2: 9459488.498 ops/s
# Warmup Iteration 3: 9711470.871 ops/s
# Warmup Iteration 4: 9670871.502 ops/s
# Warmup Iteration 5: 9652163.287 ops/s
Iteration 1: 9502266.753 ops/s
Iteration 2: 9658039.026 ops/s
Iteration 3: 9680368.471 ops/s
Iteration 4: 9704213.108 ops/s
Iteration 5: 9687128.169 ops/s
Iteration 6: 9690241.806 ops/s
Iteration 7: 9658803.461 ops/s
Iteration 8: 9706063.738 ops/s
Iteration 9: 9647602.180 ops/s
Iteration 10: 9612945.995 ops/s
Result "com.github.fabienrenaud.jjb.databind.Deserialization.simdjson_java":
9608023.663 ±(99.9%) 60566.167 ops/s [Average]
(min, avg, max) = (9481222.297, 9608023.663, 9706063.738), stdev = 69748.088
CI (99.9%): [9547457.495, 9668589.830] (assumes normal distribution)
# Run complete. Total time: 00:02:41
REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on
why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial
experiments, perform baseline and negative tests that provide experimental control, make sure
the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts.
Do not assume the numbers tell you what you want them to tell.
NOTE: Current JVM experimentally supports Compiler Blackholes, and they are in use. Please exercise
extra caution when trusting the results, look into the generated code to check the benchmark still
works, and factor in a small probability of new VM bugs. Additionally, while comparisons between
different JVMs are already problematic, the performance difference caused by different Blackhole
modes can be very significant. Please make sure you use the consistent Blackhole mode for comparisons.
Benchmark Mode Cnt Score Error Units
Deserialization.simdjson_java thrpt 20 9608023.663 ± 60566.167 ops/s
--------------------------------------------
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: java/temurin-25.0.1+8.0.LTS/bin/java
# VM options: -Xms8g -Xmx8g -XX:ActiveProcessorCount=9 --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 8 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.databind.Deserialization.fastjson
# Run progress: 0.00% complete, ETA 00:05:20
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
6021038.458 ops/s
# Warmup Iteration 2: 6114229.197 ops/s
# Warmup Iteration 3: 6071223.023 ops/s
# Warmup Iteration 4: 5984019.131 ops/s
# Warmup Iteration 5: 6081779.874 ops/s
Iteration 1: 6073575.864 ops/s
Iteration 2: 6077195.801 ops/s
Iteration 3: 6116991.679 ops/s
Iteration 4: 6140522.087 ops/s
Iteration 5: 6228232.890 ops/s
Iteration 6: 6053816.853 ops/s
Iteration 7: 6157146.864 ops/s
Iteration 8: 6111457.694 ops/s
Iteration 9: 6072063.273 ops/s
Iteration 10: 6050376.300 ops/s
# Run progress: 25.00% complete, ETA 00:04:02
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
5524890.533 ops/s
# Warmup Iteration 2: 5721376.608 ops/s
# Warmup Iteration 3: 5961596.796 ops/s
# Warmup Iteration 4: 5925222.429 ops/s
# Warmup Iteration 5: 5937484.257 ops/s
Iteration 1: 5945857.502 ops/s
Iteration 2: 5910797.907 ops/s
Iteration 3: 5947935.237 ops/s
Iteration 4: 5949597.733 ops/s
Iteration 5: 5926102.401 ops/s
Iteration 6: 5940521.412 ops/s
Iteration 7: 5976876.646 ops/s
Iteration 8: 5966091.295 ops/s
Iteration 9: 5957278.867 ops/s
Iteration 10: 5975075.434 ops/s
Result "com.github.fabienrenaud.jjb.databind.Deserialization.fastjson":
6028875.687 ±(99.9%) 78994.090 ops/s [Average]
(min, avg, max) = (5910797.907, 6028875.687, 6228232.890), stdev = 90969.711
CI (99.9%): [5949881.597, 6107869.777] (assumes normal distribution)
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: java/temurin-25.0.1+8.0.LTS/bin/java
# VM options: -Xms8g -Xmx8g -XX:ActiveProcessorCount=9 --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 8 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.databind.Deserialization.fastjson_features
# Run progress: 50.00% complete, ETA 00:02:41
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
6386044.217 ops/s
# Warmup Iteration 2: 6500024.885 ops/s
# Warmup Iteration 3: 6523171.401 ops/s
# Warmup Iteration 4: 6472059.587 ops/s
# Warmup Iteration 5: 6470423.019 ops/s
Iteration 1: 6472804.904 ops/s
Iteration 2: 6482321.272 ops/s
Iteration 3: 6454594.173 ops/s
Iteration 4: 6490703.153 ops/s
Iteration 5: 6276878.308 ops/s
Iteration 6: 6534230.400 ops/s
Iteration 7: 6523364.922 ops/s
Iteration 8: 6504721.290 ops/s
Iteration 9: 6524125.937 ops/s
Iteration 10: 6578111.829 ops/s
# Run progress: 75.00% complete, ETA 00:01:20
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
6431489.517 ops/s
# Warmup Iteration 2: 6578530.702 ops/s
# Warmup Iteration 3: 6558130.239 ops/s
# Warmup Iteration 4: 6577826.409 ops/s
# Warmup Iteration 5: 6517274.173 ops/s
Iteration 1: 6458046.160 ops/s
Iteration 2: 6409976.569 ops/s
Iteration 3: 6438689.195 ops/s
Iteration 4: 6428701.385 ops/s
Iteration 5: 6428086.032 ops/s
Iteration 6: 6389092.322 ops/s
Iteration 7: 6384367.704 ops/s
Iteration 8: 6360979.827 ops/s
Iteration 9: 6332155.732 ops/s
Iteration 10: 6324089.225 ops/s
Result "com.github.fabienrenaud.jjb.databind.Deserialization.fastjson_features":
6439802.017 ±(99.9%) 68119.639 ops/s [Average]
(min, avg, max) = (6276878.308, 6439802.017, 6578111.829), stdev = 78446.678
CI (99.9%): [6371682.378, 6507921.656] (assumes normal distribution)
# Run complete. Total time: 00:05:22
REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on
why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial
experiments, perform baseline and negative tests that provide experimental control, make sure
the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts.
Do not assume the numbers tell you what you want them to tell.
NOTE: Current JVM experimentally supports Compiler Blackholes, and they are in use. Please exercise
extra caution when trusting the results, look into the generated code to check the benchmark still
works, and factor in a small probability of new VM bugs. Additionally, while comparisons between
different JVMs are already problematic, the performance difference caused by different Blackhole
modes can be very significant. Please make sure you use the consistent Blackhole mode for comparisons.
Benchmark Mode Cnt Score Error Units
Deserialization.fastjson thrpt 20 6028875.687 ± 78994.090 ops/s
Deserialization.fastjson_features thrpt 20 6439802.017 ± 68119.639 ops/s
--------------------------------------------
SEED=15750 SHADOW=No HEAP_SIZE=8g perf stat -e cycles,instructions,cache-misses,branch-misses -e fp_ret_sse_avx_ops.all ./run deser --libs simdjson_java
+ JAR=build/libs/app.jar
+ HEAP_SIZE=8g
+ '[' -z ']'
+ JVM_OPTIONS='-server -Xms8g -Xmx8g -XX:ActiveProcessorCount=9 --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dorg.simdjson.species=512'
+ '[' -z 15750 ']'
+ '[' -z No ']'
+ exec java -server -Xms8g -Xmx8g -XX:ActiveProcessorCount=9 --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dorg.simdjson.species=512 -jar build/libs/app.jar deser --libs simdjson_java
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# JMH version: 1.35
# VM version: JDK 25.0.1, OpenJDK 64-Bit Server VM, 25.0.1+8-LTS
# VM invoker: java/temurin-25.0.1+8.0.LTS/bin/java
# VM options: -Xms8g -Xmx8g -XX:ActiveProcessorCount=9 --add-opens=java.base/java.time=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dorg.simdjson.species=512
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 10 s each
# Measurement: 10 iterations, 3 s each
# Timeout: 10 min per iteration
# Threads: 8 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.github.fabienrenaud.jjb.databind.Deserialization.simdjson_java
# Run progress: 0.00% complete, ETA 00:02:40
# Fork: 1 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
10275117.086 ops/s
# Warmup Iteration 2: 10829874.111 ops/s
# Warmup Iteration 3: 10611944.354 ops/s
# Warmup Iteration 4: 10625920.950 ops/s
# Warmup Iteration 5: 10641621.222 ops/s
Iteration 1: 10628959.685 ops/s
Iteration 2: 10634917.439 ops/s
Iteration 3: 10628316.214 ops/s
Iteration 4: 10590173.689 ops/s
Iteration 5: 10680587.601 ops/s
Iteration 6: 10597688.577 ops/s
Iteration 7: 10506609.500 ops/s
Iteration 8: 10658387.466 ops/s
Iteration 9: 10613872.726 ops/s
Iteration 10: 10554741.246 ops/s
# Run progress: 50.00% complete, ETA 00:01:20
# Fork: 2 of 2
WARNING: Using incubator modules: jdk.incubator.vector
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:java-json-benchmark/build/libs/app.jar)
WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
# Warmup Iteration 1: Using SEED=15750 as seed for Random
9205399.653 ops/s
# Warmup Iteration 2: 10420467.333 ops/s
# Warmup Iteration 3: 10529400.293 ops/s
# Warmup Iteration 4: 10511580.617 ops/s
# Warmup Iteration 5: 10473925.772 ops/s
Iteration 1: 10594217.164 ops/s
Iteration 2: 10454826.200 ops/s
Iteration 3: 10522353.833 ops/s
Iteration 4: 10555429.330 ops/s
Iteration 5: 10487314.531 ops/s
Iteration 6: 10497304.400 ops/s
Iteration 7: 10625258.261 ops/s
Iteration 8: 10443527.495 ops/s
Iteration 9: 10532615.267 ops/s
Iteration 10: 10535915.423 ops/s
Result "com.github.fabienrenaud.jjb.databind.Deserialization.simdjson_java":
10567150.802 ±(99.9%) 59225.427 ops/s [Average]
(min, avg, max) = (10443527.495, 10567150.802, 10680587.601), stdev = 68204.090
CI (99.9%): [10507925.376, 10626376.229] (assumes normal distribution)
# Run complete. Total time: 00:02:41
REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on
why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial
experiments, perform baseline and negative tests that provide experimental control, make sure
the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts.
Do not assume the numbers tell you what you want them to tell.
NOTE: Current JVM experimentally supports Compiler Blackholes, and they are in use. Please exercise
extra caution when trusting the results, look into the generated code to check the benchmark still
works, and factor in a small probability of new VM bugs. Additionally, while comparisons between
different JVMs are already problematic, the performance difference caused by different Blackhole
modes can be very significant. Please make sure you use the consistent Blackhole mode for comparisons.
Benchmark Mode Cnt Score Error Units
Deserialization.simdjson_java thrpt 20 10567150.802 ± 59225.427 ops/s
Performance counter stats for './run deser --libs simdjson_java':
4,178,065,572,481 cycles:u
15,105,183,956,264 instructions:u # 3.62 insn per cycle
3,157,503,188 cache-misses:u
498,477,305 branch-misses:u
17,072,952 fp_ret_sse_avx_ops.all:u
161.441555862 seconds time elapsed
1276.606099000 seconds user
4.726867000 seconds sys
--------------------------------------------
Benchmark Mode Cnt Score Error Units
Deserialization.genson thrpt 20 1,128,121.720 ± 37642.173 ops/s
Deserialization.jackson thrpt 20 1,658,419.505 ± 157660.069 ops/s
Deserialization.dsljson thrpt 20 2,893,103.523 ± 312059.186 ops/s
Deserialization.dsljson_reflection thrpt 20 2,198,903.375 ± 27472.983 ops/s
Deserialization.fastjson thrpt 20 4,138,669.916 ± 198432.411 ops/s
Deserialization.fastjson_features thrpt 20 4,985,441.229 ± 136236.428 ops/s
Deserialization.simdjson_java (3c) thrpt 20 3,833,938.016 ± 157670.476 ops/s
Deserialization.simdjson_java (8c) thrpt 20 7,401,863.245 ± 148159.855 ops/s
Deserialization.simdjson_java (8c,3G) thrpt 20 9,608,023.663 ± 60566.167 ops/s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment