From a16890995aea49c9d480278af00e533b005c48da Mon Sep 17 00:00:00 2001 From: "wangjie.wjdew" Date: Fri, 10 Jan 2025 17:04:48 +0800 Subject: [PATCH] feat: remove the conversion for serde value and sonic value --- Cargo.toml | 1 - benchmarks/benches/value_operator.rs | 37 -------------------- fuzz/src/lib.rs | 2 ++ src/parser.rs | 4 +-- src/value/from.rs | 39 ---------------------- src/value/node.rs | 50 ++-------------------------- 6 files changed, 6 insertions(+), 127 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 81a2744..0ed708d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,6 @@ itoa = "1.0" ref-cast = "1.0" ryu = "1.0" serde = { version = "1.0", features = ["rc", "derive"] } -serde_json = { version = "1.0", features = ["float_roundtrip", "arbitrary_precision"] } simdutf8 = "0.1" sonic-number = { path = "./sonic-number", version = "0.1" } sonic-simd = { path = "./sonic-simd", version = "0.1" } diff --git a/benchmarks/benches/value_operator.rs b/benchmarks/benches/value_operator.rs index 78de920..2eb9d10 100644 --- a/benchmarks/benches/value_operator.rs +++ b/benchmarks/benches/value_operator.rs @@ -115,42 +115,6 @@ fn bench_value_clone(c: &mut Criterion) { }); } -fn bench_convert_value(c: &mut Criterion) { - let core_ids = core_affinity::get_core_ids().unwrap(); - core_affinity::set_for_current(core_ids[0]); - - let mut data = Vec::new(); - let root = env!("CARGO_MANIFEST_DIR").to_owned(); - std::fs::File::open(root + concat!("/benches/testdata/twitter.json")) - .unwrap() - .read_to_end(&mut data) - .unwrap(); - - let sonic_value: sonic_rs::Value = sonic_rs::from_slice(&data).unwrap(); - let serde_value: serde_json::Value = serde_json::from_slice(&data).unwrap(); - - let mut group = c.benchmark_group("value"); - group.bench_with_input("sonic-rs::value_convert", &sonic_value, |b, data| { - b.iter_batched( - || data, - |value| { - let _: serde_json::Value = value.clone().into(); - }, - BatchSize::SmallInput, - ) - }); - - group.bench_with_input("serde_json::value_convert", &serde_value, |b, data| { - b.iter_batched( - || data, - |value| { - let _: sonic_rs::Value = value.clone().into(); - }, - BatchSize::SmallInput, - ) - }); -} - fn bench_modify_and_clone(c: &mut Criterion) { let core_ids = core_affinity::get_core_ids().unwrap(); core_affinity::set_for_current(core_ids[0]); @@ -312,7 +276,6 @@ criterion_group!( benches, bench_get, bench_value_clone, - bench_convert_value, bench_modify_and_clone, bench_object_insert, bench_object_get diff --git a/fuzz/src/lib.rs b/fuzz/src/lib.rs index 28138e0..d7e04fc 100644 --- a/fuzz/src/lib.rs +++ b/fuzz/src/lib.rs @@ -355,5 +355,7 @@ mod test { assert!(!test_compare_value( br#"[[{"":4, "":80} ]]"# )); + + sonic_rs_fuzz_data(br#"[45, 48, 10]"#); } } diff --git a/src/parser.rs b/src/parser.rs index 8c8b2c9..25a8d42 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -88,7 +88,7 @@ pub(crate) fn as_str(data: &[u8]) -> &str { fn get_escaped_branchless_u32(prev_escaped: &mut u32, backslash: u32) -> u32 { const EVEN_BITS: u32 = 0x5555_5555; let backslash = backslash & (!*prev_escaped); - let follows_escape = backslash << 1 | *prev_escaped; + let follows_escape = (backslash << 1) | *prev_escaped; let odd_sequence_starts = backslash & !EVEN_BITS & !follows_escape; let (sequences_starting_on_even_bits, overflow) = odd_sequence_starts.overflowing_add(backslash); @@ -118,7 +118,7 @@ macro_rules! check_visit { fn get_escaped_branchless_u64(prev_escaped: &mut u64, backslash: u64) -> u64 { const EVEN_BITS: u64 = 0x5555_5555_5555_5555; let backslash = backslash & (!*prev_escaped); - let follows_escape = backslash << 1 | *prev_escaped; + let follows_escape = (backslash << 1) | *prev_escaped; let odd_sequence_starts = backslash & !EVEN_BITS & !follows_escape; let (sequences_starting_on_even_bits, overflow) = odd_sequence_starts.overflowing_add(backslash); diff --git a/src/value/from.rs b/src/value/from.rs index 2d15acb..3bf0ad1 100644 --- a/src/value/from.rs +++ b/src/value/from.rs @@ -512,45 +512,6 @@ impl From for Value { } } -impl From for Value { - #[inline] - fn from(val: serde_json::Value) -> Self { - match val { - serde_json::Value::Null => Value::new_null(), - serde_json::Value::Bool(b) => Value::new_bool(b), - serde_json::Value::Number(n) => { - if let Some(u) = n.as_u64() { - Value::new_u64(u) - } else if let Some(i) = n.as_i64() { - Value::new_i64(i) - } else if let Some(n) = n.as_f64() { - Value::new_f64(n) - .expect("serde_json Number's as_f64 api will not return NaN or Infinity") - } else { - let n = n.as_str(); - Value::new_rawnum(n) - } - } - serde_json::Value::String(s) => Value::copy_str(&s), - serde_json::Value::Array(arr) => { - let mut array = Array::with_capacity(arr.len()).0; - for v in arr { - array.append_value(v.into()); - } - array - } - serde_json::Value::Object(obj) => { - let mut object = Object::with_capacity(obj.len()).0; - for (k, v) in obj { - let value: Value = v.into(); - object.append_pair((k.as_str().into(), value)); - } - object - } - } - } -} - #[cfg(test)] mod test { diff --git a/src/value/node.rs b/src/value/node.rs index 1353b5d..c84cf55 100644 --- a/src/value/node.rs +++ b/src/value/node.rs @@ -1807,50 +1807,6 @@ impl Serialize for Value { } } -impl From for serde_json::Value { - #[inline] - fn from(val: Value) -> Self { - match val.as_ref2() { - ValueRefInner::Null => serde_json::Value::Null, - ValueRefInner::Bool(b) => serde_json::Value::Bool(b), - ValueRefInner::Number(n) => { - if let Some(n) = n.as_i64() { - serde_json::Value::from(n) - } else if let Some(n) = n.as_u64() { - serde_json::Value::from(n) - } else if let Some(n) = n.as_f64() { - serde_json::Value::from(n) - } else { - unreachable!("invalid number") - } - } - ValueRefInner::Str(s) => serde_json::Value::String(s.to_string()), - ValueRefInner::Array(a) => { - let mut arr = Vec::with_capacity(a.len()); - for n in a { - arr.push(serde_json::Value::from(n.clone())); - } - serde_json::Value::Array(arr) - } - ValueRefInner::EmptyArray => serde_json::Value::Array(Vec::new()), - ValueRefInner::EmptyObject => serde_json::Value::Object(serde_json::Map::new()), - ValueRefInner::Object(o) => { - let mut obj = serde_json::Map::with_capacity(o.len()); - for (k, v) in o { - obj.insert(k.to_string(), serde_json::Value::from(v.clone())); - } - serde_json::Value::Object(obj) - } - ValueRefInner::RawNum(raw) => { - serde_json::Number::from_string_unchecked(raw.to_string()).into() - } - ValueRefInner::RawStr(UnpackedRawStr { raw, str: _ }) => { - serde_json::Value::String(raw.to_string()) - } - } - } -} - #[cfg(test)] mod test { use std::path::Path; @@ -1883,9 +1839,7 @@ mod test { fn test_value(data: &str) -> Result<()> { let serde_value: serde_json::Result = serde_json::from_str(data); - let mut de = Deserializer::from_str(data).use_rawnumber(); - let dom = de.deserialize(); - let trailing_check = de.parser.parse_trailing(); + let dom: Result = from_slice(data.as_bytes()); if let Ok(serde_value) = serde_value { let dom: Value = dom.unwrap(); @@ -1903,7 +1857,7 @@ mod test { ))) } } else { - if dom.is_err() || trailing_check.is_err() { + if dom.is_err() { return Ok(()); } let dom = dom.unwrap();