SJF4J vs Jayway JsonPath: Java 벤치마크에서 최대 7배 빠름
Source: Dev.to
벤치마크 개요
- SJF4J –
- Jayway JsonPath –
Result: SJF4J is up to 7× faster. → **결과: SJF4J가 최대 7배 빠릅니다.
The JMH benchmark suite compared:
- SJF4J v1.5.0
- Jayway JsonPath v2.9.0
Across three workload shapes:
- Path compilation → 1. 경로 컴파일
- Query on a shared
JsonNode→ 2. 공유된JsonNode에 대한 쿼리 - Query on Map/List object graphs → 3. Map/List 객체 그래프에 대한 쿼리
JMH 구성
- 워밍업: 5 × 300 ms
- 측정: 8 × 300 ms
- 포크: 2
- 스레드: 1
사용된 표현식
$.store.book[1].price
$.store.bicycle.color
$.store.book[*].author
$..price
$.store.book[?(@.price > 10)].title
$.store.book[0,2].title
헤드라인 결과
기하 평균 (낮을수록 좋음)
| 벤치마크 그룹 | SJF4J | Jayway | 결과 |
|---|---|---|---|
| compile | 97 ns/op | 125 ns/op | 1.28배 빠름 |
| query_definite | 100 ns/op | 237 ns/op | 2.38배 빠름 |
| query_indefinite | 656 ns/op | 1 294 ns/op | 1.97배 빠름 |
| query_map_list_definite | 31 ns/op | 200 ns/op | 6.38배 빠름 |
| query_map_list_indefinite | 280 ns/op | 1 301 ns/op | 4.65배 빠름 |
요약 – 일반 쿼리에서는 약 2배 빠르고, Map/List에서는 최대 7배 빠르며, 컴파일 속도도 향상되었습니다.
Shared JsonNode에 대한 쿼리
확정 쿼리
| Expression | SJF4J | Jayway | 결과 |
|---|---|---|---|
$.store.book[1].price | 111 ns/op | 260 ns/op | 2.35× faster |
$.store.bicycle.color | 90 ns/op | 216 ns/op | 2.40× faster |
불확정 쿼리
| Expression | SJF4J | Jayway | 결과 |
|---|---|---|---|
$.store.book[*].author | 342 ns/op | 910 ns/op | 2.66× faster |
$..price | 1 736 ns/op | 3 877 ns/op | 2.23× faster |
$.store.book[?(@.price > 10)].title | 1 292 ns/op | 1 660 ns/op | 1.29× faster |
$.store.book[0,2].title | 242 ns/op | 478 ns/op | 1.98× faster |
결론: SJF4J는 JSONPath 엔진으로서 일관되게 더 빠릅니다.
Source: …
Map/List 객체 그래프에 대한 쿼리
정확한 쿼리
| Expression | SJF4J | Jayway | Result |
|---|---|---|---|
$.store.book[1].price | 37 ns/op | 280 ns/op | 7.50× faster |
$.store.bicycle.color | 26 ns/op | 142 ns/op | 5.42× faster |
$.store.book[*].author | 135 ns/op | 1 045 ns/op | 7.73× faster |
$..price | 543 ns/op | 2 495 ns/op | 4.59× faster |
$.store.book[?(@.price > 10)].title | 823 ns/op | 1 836 ns/op | 2.23× faster |
$.store.book[0,2].title | 102 ns/op | 598 ns/op | 5.89× faster |
불확정 쿼리
| Expression | SJF4J | Jayway | Result |
|---|---|---|---|
| (위와 동일한 집합, “불확정” 그룹에서 측정) | – | – | – |
요약: 애플리케이션이 이미 Map/List 객체 그래프에서 동작하고 있다면, SJF4J가 가장 큰 성능 향상을 제공합니다.
객체 표현별 벤치마크
| 벤치마크 그룹 | Map/List (ns/op) | JOJO (ns/op) | POJO (ns/op) |
|---|---|---|---|
| definite | 31 | 43 | 94 |
| indefinite | 270 | 373 | 554 |
상세 표현식 성능
| 표현식 | Map/List | JOJO | POJO |
|---|---|---|---|
$.store.book[1].price | 37 ns/op | 46 ns/op | 102 ns/op |
$.store.bicycle.color | 26 ns/op | 40 ns/op | 87 ns/op |
$.store.book[*].author | 131 ns/op | 196 ns/op | 374 ns/op |
$..price | 496 ns/op | 914 ns/op | 955 ns/op |
$.store.book[?(@.price > 10)].title | 807 ns/op | 876 ns/op | 1 100 ns/op |
이 결과가 의미하는 바
- Map/List 가 가장 빠릅니다 (추상화가 없음).
- JOJO (JSON Object + Java Object 하이브리드)는 최소한의 오버헤드만 추가합니다.
- POJO 가 더 느리지만 여전히 실용적입니다.
핵심 인사이트
중간 JSON AST 로 변환하지 않고 도메인 모델에 바로 JSONPath 를 적용할 수 있습니다:
POJO → JSONPath → result
전통적인 방식:
POJO → JsonNode → JSONPath → result
이렇게 하면 데이터 처리 파이프라인에서 전체 레이어를 제거하게 되어, 위에서 관찰된 성능 차이를 얻을 수 있습니다.
결론
- SJF4J는 다른 라이브러리에서 요구되는 변환 작업을 피합니다.
- Jayway JsonPath는 기본 사용에는 괜찮지만, 성능이 중요한 경우—특히 Map/List 또는 POJO 객체 그래프에서—SJF4J가 단순히 더 빠릅니다.
GitHub:
Benchmark source: JsonPathCompareBenchmark.java