diff --git a/benchmarks/competitors/serde/.cargo/config.toml b/benchmarks/competitors/serde/.cargo/config.toml new file mode 100644 index 0000000..21cdf40 --- /dev/null +++ b/benchmarks/competitors/serde/.cargo/config.toml @@ -0,0 +1,5 @@ +[target.aarch64-apple-darwin] +rustflags = [ + "-C", "link-arg=-L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib", + "-C", "link-arg=-L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/system", +] diff --git a/benchmarks/competitors/serde/Cargo.toml b/benchmarks/competitors/serde/Cargo.toml new file mode 100644 index 0000000..2c5a475 --- /dev/null +++ b/benchmarks/competitors/serde/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "serde-benchmark" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" diff --git a/benchmarks/competitors/serde/src/main.rs b/benchmarks/competitors/serde/src/main.rs new file mode 100644 index 0000000..2837284 --- /dev/null +++ b/benchmarks/competitors/serde/src/main.rs @@ -0,0 +1,141 @@ +extern crate serde; +extern crate serde_json; + +use std::fs; +use serde::{Serialize, Deserialize}; +use std::time::Instant; + +#[derive(Serialize, Deserialize, Debug)] +struct Metadata { + result_type: String, + iso_language_code: String, +} + +#[derive(Serialize, Deserialize, Debug)] +struct User { + id: i64, + id_str: String, + name: String, + screen_name: String, + location: String, + description: String, + url: Option<String>, + protected: bool, + followers_count: i64, + friends_count: i64, + listed_count: i64, + created_at: String, + favourites_count: i64, + utc_offset: Option<i64>, + time_zone: Option<String>, + geo_enabled: bool, + verified: bool, + statuses_count: i64, + lang: String, + profile_background_color: String, + profile_background_image_url: String, + profile_background_image_url_https: String, + profile_background_tile: bool, + profile_image_url: String, + profile_image_url_https: String, + profile_banner_url: Option<String>, + profile_link_color: String, + profile_sidebar_border_color: String, + profile_sidebar_fill_color: String, + profile_text_color: String, + profile_use_background_image: bool, + default_profile: bool, + default_profile_image: bool, + following: bool, + follow_request_sent: bool, + notifications: bool, +} + +#[derive(Serialize, Deserialize, Debug)] +struct Hashtag {} + +#[derive(Serialize, Deserialize, Debug)] +struct Url {} + +#[derive(Serialize, Deserialize, Debug)] +struct UserMention { + screen_name: String, + name: String, + id: i64, + id_str: String, + indices: Vec<i64>, +} + +#[derive(Serialize, Deserialize, Debug)] +struct Entities { + hashtags: Vec<Hashtag>, + urls: Vec<Url>, + user_mentions: Vec<UserMention>, +} + +#[derive(Serialize, Deserialize, Debug)] +struct Status { + metadata: Metadata, + created_at: String, + id: i64, + id_str: String, + text: String, + source: String, + truncated: bool, + in_reply_to_status_id: Option<i64>, + in_reply_to_status_id_str: Option<String>, + in_reply_to_user_id: Option<i64>, + in_reply_to_user_id_str: Option<String>, + in_reply_to_screen_name: Option<String>, + user: User, + geo: Option<String>, + coordinates: Option<String>, + place: Option<String>, + contributors: Option<String>, + retweet_count: i64, + favorite_count: i64, + favorited: bool, + retweeted: bool, + entities: Entities, + lang: String, +} + +#[derive(Serialize, Deserialize, Debug)] +struct TwitterData { + statuses: Vec<Status>, +} + +fn main() { + // Read the JSON data from the file once + let data = fs::read_to_string("/Users/random_person/Desktop/experimental_json_builder/benchmarks/src/data/twitter.json") + .expect("Unable to read file"); + + // Deserialize the JSON data into a TwitterData object once + let twitter_data: TwitterData = serde_json::from_str(&data) + .expect("Unable to deserialize data"); + + let num_iterations = 500; + let mut total_serialize_duration = 0.0; + let mut output_volume = 0; + + for _ in 0..num_iterations { + let start = Instant::now(); + let serialized = serde_json::to_string(&twitter_data) + .expect("Unable to serialize data"); + let serialize_duration = start.elapsed().as_secs_f64(); + total_serialize_duration += serialize_duration; + + output_volume += serialized.len(); + } + + let avg_serialize_time = total_serialize_duration / num_iterations as f64; + let throughput_mb_s = (output_volume as f64 / 1_000_000.0) / total_serialize_duration; + + println!("# volume: {} bytes", data.len()); + println!("# output volume: {} bytes", output_volume); + println!("# output volume per string: {:.1} bytes", output_volume as f64 / num_iterations as f64); + println!("# number of inputs: {}", num_iterations); + println!("Serialization:"); + println!(" Avg time per operation: {:.6} s", avg_serialize_time); + println!(" Throughput: {:.2} MB/s", throughput_mb_s); +}