-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmain.rs
More file actions
141 lines (125 loc) · 3.89 KB
/
main.rs
File metadata and controls
141 lines (125 loc) · 3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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);
}