#Rust https://github.com/serde-rs/json/issues/160 原因はファイル読み込む方法にある。[[RustでJSONファイルをstructにパース]]するコードをベースに、大きな[[JSON]]を読み込んだ時間を比較する。 `User`オブジェクト20万要素近く含んだ[[JSON]]を使う。サイズは7.7M。 ## BufReaderナシでfrom_readerを使う場合 ```rust fn main() { let f = File::open(Path::new("users.json")).unwrap(); let _r: Root = serde_json::from_reader(f).unwrap(); } ``` 13秒くらい。 ```powershell $ Measure-Command { cargo run } Finished dev [unoptimized + debuginfo] target(s) in 0.02s Running `target\debug\rust-serde.exe` Days : 0 Hours : 0 Minutes : 0 Seconds : 13 Milliseconds : 718 Ticks : 137186349 TotalDays : 0.000158780496527778 TotalHours : 0.00381073191666667 TotalMinutes : 0.228643915 TotalSeconds : 13.7186349 TotalMilliseconds : 13718.6349 ``` release buildした場合は11~12秒程度になるが、ネックはFileIOなのでほぼ変わらない。 ## BufReaderとfrom_readerを使う場合 ```rust fn main() { let br = BufReader::new(File::open(Path::new("users.json")).unwrap()); let _r: Root = serde_json::from_reader(br).unwrap(); } ``` 1.4秒くらい。**10倍くらい速くなる**。 ```powershell $ Measure-Command { cargo run } Finished dev [unoptimized + debuginfo] target(s) in 0.02s Running `target\debug\rust-serde.exe` Days : 0 Hours : 0 Minutes : 0 Seconds : 1 Milliseconds : 368 Ticks : 13680954 TotalDays : 1.58344375E-05 TotalHours : 0.0003800265 TotalMinutes : 0.02280159 TotalSeconds : 1.3680954 TotalMilliseconds : 1368.0954 ``` release buildした場合は0.1秒と更に15倍速くなった。 ## from_strを使う場合 ```rust fn main() { let mut str = String::new(); let _ = File::open(Path::new("users.json")) .unwrap() .read_to_string(&mut str); let _r: Root = serde_json::from_str(&str).unwrap(); } ``` ```powershell $ Measure-Command { cargo run } Finished dev [unoptimized + debuginfo] target(s) in 0.02s Running `target\debug\rust-serde.exe` Days : 0 Hours : 0 Minutes : 0 Seconds : 0 Milliseconds : 485 Ticks : 4856980 TotalDays : 5.62150462962963E-06 TotalHours : 0.000134916111111111 TotalMinutes : 0.00809496666666667 TotalSeconds : 0.485698 TotalMilliseconds : 485.698 ``` 0.5秒くらい。**30倍くらい速くなる**。 release buildした場合は0.05秒と更に10倍速くなった。