#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倍速くなった。