1// Copyright (c) 2023 Huawei Device Co., Ltd.
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6//     http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14//! A performance testing suite for ylong_json.
15//!
16//! This performance testing suite compares the speed of the `ylong_json` crate
17//! with `serde_json` for parsing JSON text and converting JSON objects into
18//! strings. The test is run multiple times as defined by `LOOPS_NUM`.
19//!
20//! Example JSON used in this test represents an image object with various properties.
21
22use serde_json::Value;
23use std::str::FromStr;
24use std::time::Instant;
25use ylong_json::JsonValue;
26
27const LOOPS_NUM: usize = 10000;
28const JSON_TEXT: &str = r#"
29{
30    "Image": {
31        "Width":  800,
32        "Height": 600,
33        "Title":  "View from 15th Floor",
34        "Thumbnail": {
35            "Url":    "http://www.example.com/image/481989943",
36            "Height": 125,
37            "Width":  100
38        },
39        "Animated" : false,
40        "IDs": [116, 943, 234, 38793]
41    }
42}
43"#;
44
45fn main() {
46    let value = JsonValue::from_str(JSON_TEXT).unwrap();
47    println!("{}", value.to_compact_string().unwrap());
48
49    let st = Instant::now();
50    for _ in 0..LOOPS_NUM {
51        let value = JsonValue::from_str(JSON_TEXT).unwrap();
52        let _ = value.to_compact_string();
53    }
54    let ed = Instant::now();
55    println!(
56        "ylong_json: {}ms",
57        ed.duration_since(st).as_secs_f64() * 1000f64
58    );
59
60    let value: Value = serde_json::from_str(JSON_TEXT).unwrap();
61    println!("{value}");
62
63    let st = Instant::now();
64    for _ in 0..LOOPS_NUM {
65        let value: Value = serde_json::from_str(JSON_TEXT).unwrap();
66        format!("{value}");
67    }
68    let ed = Instant::now();
69    println!(
70        "serde_json: {}ms",
71        ed.duration_since(st).as_secs_f64() * 1000f64
72    );
73}
74