Skip to content
/ jsonic Public

Fast, small JSON parsing library for rust

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENCE-APACHE
MIT
LICENCE-MIT
Notifications You must be signed in to change notification settings

g1mv/jsonic

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

43 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

jsonic

Fast, small JSON parsing library for rust with no dependencies

Quick overview

jsonic is a JSON parser. It aims at providing high-speed extraction of JSON data. It does not convert JSON to structs at this stage.

Performance

Here are some of the design choices for this library:

  • small-footprint data structures to speedup memory/cache access
  • object containers with hybrid data structures, using arrays to store low numbers of key/value pairs, and binary tree maps otherwise
  • binary tree maps insertion/fetch speed enhanced by use of fast hashing on keys
  • no data copying, source text data is never copied
  • type conversions done on a per-request basis

jsonic does not make use of any particular instruction set/platform-specific optimization, so should have portable performance on all rust-compatible systems.

Example use

fn main() {
    let json = "{\"jsonic\": \"Fast, small JSON parsing library for rust with no dependencies\"}";

    match jsonic::parse(json) {
        Ok(parsed) => { println!("Describe jsonic? {:?}", parsed["jsonic"].as_str()); }
        Err(error) => { eprintln!("{}", error); }
    }
}

Benchmark

To get an overview of jsonic's parsing performance compared to other JSON parsing engines written in rust, use cargo bench.

Here is a sample run on an Apple iMac M1, 8GB RAM, macOS Sonoma:

     Running benches/json-rust.rs (target/release/deps/json_rust-0d2370885fb224f4)
Timer precision: 41 ns
json_rust                               fastest       │ slowest       │ median        │ mean          │ samples │ iters
╰─ parse                                              │               │               │               │         │
   ├─ ./benches/data/canada.json        5.66 ms       │ 6.038 ms      │ 5.781 ms      │ 5.764 ms      │ 100     │ 100
   ├─ ./benches/data/citm_catalog.json  2.028 ms      │ 2.309 ms      │ 2.05 ms       │ 2.055 ms      │ 100     │ 100
   ╰─ ./benches/data/twitter.json       823.4 µs      │ 1.027 ms      │ 832 µs        │ 835.4 µs      │ 100     │ 100

     Running benches/jsonic.rs (target/release/deps/jsonic-0031ab613974bf81)
Timer precision: 41 ns
jsonic                                  fastest       │ slowest       │ median        │ mean          │ samples │ iters
╰─ parse                                              │               │               │               │         │
   ├─ ./benches/data/canada.json        2.519 ms      │ 3.089 ms      │ 2.549 ms      │ 2.565 ms      │ 100     │ 100
   ├─ ./benches/data/citm_catalog.json  1.453 ms      │ 1.633 ms      │ 1.477 ms      │ 1.479 ms      │ 100     │ 100
   ╰─ ./benches/data/twitter.json       555.3 µs      │ 658.9 µs      │ 560.5 µs      │ 563.2 µs      │ 100     │ 100

     Running benches/serde_json.rs (target/release/deps/serde_json-b37e83074b30325e)
Timer precision: 41 ns
serde_json                              fastest       │ slowest       │ median        │ mean          │ samples │ iters
╰─ parse                                              │               │               │               │         │
   ├─ ./benches/data/canada.json        4.489 ms      │ 4.977 ms      │ 4.561 ms      │ 4.58 ms       │ 100     │ 100
   ├─ ./benches/data/citm_catalog.json  2.177 ms      │ 2.961 ms      │ 2.223 ms      │ 2.231 ms      │ 100     │ 100
   ╰─ ./benches/data/twitter.json       1.031 ms      │ 1.203 ms      │ 1.041 ms      │ 1.046 ms      │ 100     │ 100

     Running benches/simd-json.rs (target/release/deps/simd_json-274159a472ebf0bc)
Timer precision: 41 ns
simd_json                               fastest       │ slowest       │ median        │ mean          │ samples │ iters
╰─ parse                                              │               │               │               │         │
   ├─ ./benches/data/canada.json        5.494 ms      │ 6.828 ms      │ 5.709 ms      │ 5.716 ms      │ 100     │ 100
   ├─ ./benches/data/citm_catalog.json  2.695 ms      │ 3.883 ms      │ 2.766 ms      │ 2.78 ms       │ 100     │ 100
   ╰─ ./benches/data/twitter.json       1.114 ms      │ 1.726 ms      │ 1.127 ms      │ 1.162 ms      │ 100     │ 100

     Running benches/sonic-rs.rs (target/release/deps/sonic_rs-0ab724f2d9eb477b)
Timer precision: 41 ns
sonic_rs                                fastest       │ slowest       │ median        │ mean          │ samples │ iters
╰─ parse                                              │               │               │               │         │
   ├─ ./benches/data/canada.json        4.104 ms      │ 4.794 ms      │ 4.196 ms      │ 4.217 ms      │ 100     │ 100
   ├─ ./benches/data/citm_catalog.json  1.783 ms      │ 2.662 ms      │ 1.815 ms      │ 1.845 ms      │ 100     │ 100
   ╰─ ./benches/data/twitter.json       817.2 µs      │ 1.025 ms      │ 834 µs        │ 834.5 µs      │ 100     │ 100