如何解决 Dart 解析大 Json 文件慢

查看 82|回复 5
作者:simman   
最近在写 Flutter 应用,发现 Dart 解析比较大的 json 比较慢,会影响 UI 线程,使用 compute 的话,的确不影响 UI 线程了,但是解析起来更慢,想着可以使用 flutter rust bridge 做个 json 解析库,不过我用 rust 写个测试程序,发现解析 json 比 dart 快不了多少,各位有啥好意见没?
各语言测试:
time node index.js                           1.37s user 0.19s system 121% cpu 1.282 total
time go build && ./main                      1.59s user 0.02s system 80% cpu 2.002 total
time python3.9 main.py                       2.45s user 0.27s system 98% cpu 2.762 total
time cargo run --release                     2.46s user 0.42s system 97% cpu 2.972 total
time dart compile exe main.dart && bin/main  4.62s user 0.45s system 114% cpu 4.415 total
rust code:
use std::fs::File;
use std::io::{Read};
use serde_json::Value;
fn parse_json(contents: Vec) {
    let now = std::time::Instant::now();
    let _: Value = serde_json::from_slice(&contents).unwrap();
    let elapsed = now.elapsed();
    println!("elapsed: {:?}", elapsed);
}
fn main() {
    let contents = {
        let mut vec = Vec::new();
        // https://github.com/json-iterator/test-data/blob/master/large-file.json
        File::open("large-file.json").unwrap().read_to_end(&mut vec).unwrap();
        vec
    };
    for _ in 0..10 {
        parse_json(contents.clone());
    }
}
测试机器:MacBook Pro (16-inch, 2019) 2.3 GHz 八核 Intel Core i9 32 GB 2667 MHz DDR4
不好意思,上面使用time统计时间是不包含程序编译时间的,只是发主题的时候合到一起的。
for 循环打印的结果如下:
NodeJs: 110 ms
NodeJs: 107 ms
NodeJs: 103 ms
NodeJs: 106 ms
NodeJs: 128 ms
NodeJs: 94 ms
NodeJs: 93 ms
NodeJs: 92 ms
NodeJs: 98 ms
NodeJs: 93 ms
Dart: 384 ms
Dart: 390 ms
Dart: 377 ms
Dart: 395 ms
Dart: 356 ms
Dart: 381 ms
Dart: 378 ms
Dart: 370 ms
Dart: 388 ms
耗时: 379 ms
Python: 241.057 ms
Python: 233.375 ms
Python: 249.352 ms
Python: 244.968 ms
Python: 249.487 ms
Python: 288.286 ms
Python: 263.347 ms
Python: 255.939 ms
Python: 256.224 ms
Python: 252.851 ms
Golang: 171 ms
Golang: 162 ms
Golang: 160 ms
Golang: 161 ms
Golang: 161 ms
Golang: 160 ms
Golang: 165 ms
Golang: 157 ms
Golang: 161 ms
Golang: 158 ms
Rust: 297.331601ms
Rust: 268.03852ms
Rust: 280.606788ms
Rust: 272.826854ms
Rust: 293.53427ms
Rust: 269.841906ms
Rust: 285.450976ms
Rust: 288.862249ms
Rust: 275.984671ms
Rust: 276.715469ms

vec, Dart, JSON, user

MoYi123   
不好意思,上面使用time统计时间是不包含程序编译时间的,只是发主题的时候合到一起的。
for 循环打印的结果如下:
NodeJs: 110 ms
NodeJs: 107 ms
NodeJs: 103 ms
NodeJs: 106 ms
NodeJs: 128 ms
NodeJs: 94 ms
NodeJs: 93 ms
NodeJs: 92 ms
NodeJs: 98 ms
NodeJs: 93 ms
Dart: 384 ms
Dart: 390 ms
Dart: 377 ms
Dart: 395 ms
Dart: 356 ms
Dart: 381 ms
Dart: 378 ms
Dart: 370 ms
Dart: 388 ms
耗时: 379 ms
Python: 241.057 ms
Python: 233.375 ms
Python: 249.352 ms
Python: 244.968 ms
Python: 249.487 ms
Python: 288.286 ms
Python: 263.347 ms
Python: 255.939 ms
Python: 256.224 ms
Python: 252.851 ms
Golang: 171 ms
Golang: 162 ms
Golang: 160 ms
Golang: 161 ms
Golang: 161 ms
Golang: 160 ms
Golang: 165 ms
Golang: 157 ms
Golang: 161 ms
Golang: 158 ms
Rust: 297.331601ms
Rust: 268.03852ms
Rust: 280.606788ms
Rust: 272.826854ms
Rust: 293.53427ms
Rust: 269.841906ms
Rust: 285.450976ms
Rust: 288.862249ms
Rust: 275.984671ms
Rust: 276.715469ms
codehz   
为什么要把编译的时间也算进去?
simman
OP
  
你可以考虑一下解析 json 的目的,如果可行的话,不需要先变成一个对象,而是直接从流式解析中提取需要的数据
newmlp   
@MoYi123 go 、rust 、dart 实际是编译完后再 time 执行的。上面写的有问题。
codehz   
你这都把程序启动时间算上了,肯定不准啊,json 解析才能用多少时间估计 1ms 都不到
您需要登录后才可以回帖 登录 | 立即注册

返回顶部