forked from jorgecarleitao/arrow2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathread_json.rs
67 lines (48 loc) · 1.87 KB
/
read_json.rs
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
use arrow2::array::Array;
use arrow2::datatypes::DataType;
use criterion::{criterion_group, criterion_main, Criterion};
use arrow2::io::json::{read, write};
use arrow2::util::bench_util::*;
fn prep(array: impl Array + 'static) -> (Vec<u8>, DataType) {
let mut data = vec![];
let blocks = write::Serializer::new(
vec![Ok(Box::new(array) as Box<dyn Array>)].into_iter(),
vec![],
);
// the operation of writing is IO-bounded.
write::write(&mut data, blocks).unwrap();
let value = read::json_deserializer::parse(&data).unwrap();
let dt = read::infer(&value).unwrap();
(data, dt)
}
fn bench_read(data: &[u8], dt: &DataType) {
let value = read::json_deserializer::parse(data).unwrap();
read::deserialize(&value, dt.clone()).unwrap();
}
fn add_benchmark(c: &mut Criterion) {
(10..=20).step_by(2).for_each(|log2_size| {
let size = 2usize.pow(log2_size);
let array = create_primitive_array::<i32>(size, 0.1);
let (data, dt) = prep(array);
c.bench_function(&format!("read i32 2^{log2_size}"), |b| {
b.iter(|| bench_read(&data, &dt))
});
let array = create_primitive_array::<f64>(size, 0.1);
let (data, dt) = prep(array);
c.bench_function(&format!("read f64 2^{log2_size}"), |b| {
b.iter(|| bench_read(&data, &dt))
});
let array = create_string_array::<i32>(size, 10, 0.1, 42);
let (data, dt) = prep(array);
c.bench_function(&format!("read utf8 2^{log2_size}"), |b| {
b.iter(|| bench_read(&data, &dt))
});
let array = create_boolean_array(size, 0.1, 0.1);
let (data, dt) = prep(array);
c.bench_function(&format!("read bool 2^{log2_size}"), |b| {
b.iter(|| bench_read(&data, &dt))
});
})
}
criterion_group!(benches, add_benchmark);
criterion_main!(benches);