Skip to content

Commit

Permalink
feat: remove the conversion for serde value and sonic value
Browse files Browse the repository at this point in the history
  • Loading branch information
Ggiggle authored and liuq19 committed Jan 10, 2025
1 parent 3f57ef6 commit a168909
Show file tree
Hide file tree
Showing 6 changed files with 6 additions and 127 deletions.
1 change: 0 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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" }
Expand Down
37 changes: 0 additions & 37 deletions benchmarks/benches/value_operator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions fuzz/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -355,5 +355,7 @@ mod test {
assert!(!test_compare_value(
br#"[[{"":4, "":80} ]]"#
));

sonic_rs_fuzz_data(br#"[45, 48, 10]"#);
}
}
4 changes: 2 additions & 2 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
39 changes: 0 additions & 39 deletions src/value/from.rs
Original file line number Diff line number Diff line change
Expand Up @@ -512,45 +512,6 @@ impl From<Object> for Value {
}
}

impl From<serde_json::Value> 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 {

Expand Down
50 changes: 2 additions & 48 deletions src/value/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1807,50 +1807,6 @@ impl Serialize for Value {
}
}

impl From<Value> 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;
Expand Down Expand Up @@ -1883,9 +1839,7 @@ mod test {

fn test_value(data: &str) -> Result<()> {
let serde_value: serde_json::Result<serde_json::Value> = 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<Value> = from_slice(data.as_bytes());

if let Ok(serde_value) = serde_value {
let dom: Value = dom.unwrap();
Expand All @@ -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();
Expand Down

0 comments on commit a168909

Please sign in to comment.