summaryrefslogtreecommitdiff
path: root/benches/sheet_benchmark.rs
blob: a2a79ed8b068ebfc388cd6c1ed97c6f05c3669bd (plain)
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
use std::{env::current_dir, hint::black_box, path::PathBuf};

use criterion::{Criterion, criterion_group, criterion_main};
use sheet_system::{
    index_source::IndexSource,
    mapping::{LocalMapping, LocalMappingForward},
    sheet::SheetData,
};

fn sheet_file() -> PathBuf {
    current_dir().unwrap().join(".temp").join("benchmark.sheet")
}

fn sheet_benchmark(c: &mut Criterion) {
    let sheet_file = sheet_file();
    std::fs::write(&sheet_file, sheet_write(u16::MAX as usize).as_bytes()).unwrap();

    c.bench_function("sheet insert and apply", |b| b.iter(|| sheet_write(25)));
    c.bench_function("sheet full read", |b| {
        b.iter(|| sheet_full_read(&sheet_file))
    });
    c.bench_function("sheet mmap read", |b| {
        b.iter(|| sheet_mmap_read(&sheet_file))
    });
    c.bench_function("sheet mmap copy read", |b| {
        b.iter(|| sheet_mmap_copy_read(&sheet_file))
    });
    c.bench_function("sheet mmap read x10000", |b| {
        let mmap = SheetData::mmap(&sheet_file).unwrap();
        let key = ["docs", "my_file_12.txt"];

        b.iter(|| {
            for _ in 0..10000 {
                black_box(mmap.mp_c(&key).unwrap());
            }
        })
    });
}

fn sheet_write(count: usize) -> SheetData {
    let mut sheet = SheetData::empty().pack("empty");
    (0..count).for_each(|n| {
        sheet
            .insert_mapping(
                LocalMapping::new(
                    vec!["docs".to_string(), format!("my_file_{}.txt", n)],
                    IndexSource::new(true, n as u32, 2u16),
                    LocalMappingForward::Latest,
                )
                .unwrap(),
            )
            .unwrap();
    });
    sheet.apply().unwrap();
    sheet.unpack()
}

async fn sheet_full_read(path: &PathBuf) {
    let mut sheet_data = SheetData::empty();
    sheet_data.full_read(path).await.unwrap();
}

fn sheet_mmap_read(path: &PathBuf) {
    let mmap = SheetData::mmap(path).unwrap();
    mmap.mp(&["docs", "my_file_12.txt"]).unwrap().unwrap();
}

fn sheet_mmap_copy_read(path: &PathBuf) {
    let mmap = SheetData::mmap(path).unwrap();
    mmap.mp_c(&["docs", "my_file_12.txt"]).unwrap().unwrap();
}

criterion_group!(benches, sheet_benchmark);
criterion_main!(benches);