Skip to main content

bench_local/
bench_local.rs

1use std::env;
2use std::time::Instant;
3
4use mdict_rs::{MddFile, MdxFile};
5
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7    let mut args = env::args().skip(1);
8    let mdx_path = args
9        .next()
10        .ok_or("usage: bench_local <mdx_path> <mdd_path>")?;
11    let mdd_path = args
12        .next()
13        .ok_or("usage: bench_local <mdx_path> <mdd_path>")?;
14
15    let open_start = Instant::now();
16    let mdx = MdxFile::open(&mdx_path)?;
17    let mdx_open = open_start.elapsed();
18
19    let queries = ["apple", "book", "zebra", "Apple"];
20    let lookup_start = Instant::now();
21    let mut total_chars = 0usize;
22    for query in queries {
23        let record = mdx.lookup(query)?.ok_or("missing benchmark MDX key")?;
24        total_chars += record.text.len();
25    }
26    let mdx_lookup = lookup_start.elapsed();
27
28    let key_scan_start = Instant::now();
29    let mut mdx_key_count = 0usize;
30    let mut mdx_key_bytes = 0usize;
31    for key in mdx.keys() {
32        let key = key?;
33        mdx_key_count += 1;
34        mdx_key_bytes += key.len();
35    }
36    let mdx_key_scan = key_scan_start.elapsed();
37
38    let entry_scan_start = Instant::now();
39    let mut mdx_entry_count = 0usize;
40    let mut mdx_entry_key_bytes = 0usize;
41    let mut mdx_entry_text_bytes = 0usize;
42    for entry in mdx.entries() {
43        let entry = entry?;
44        mdx_entry_count += 1;
45        mdx_entry_key_bytes += entry.key.len();
46        mdx_entry_text_bytes += entry.text.len();
47    }
48    let mdx_entry_scan = entry_scan_start.elapsed();
49
50    let open_start = Instant::now();
51    let mdd = MddFile::open(&mdd_path)?;
52    let mdd_open = open_start.elapsed();
53
54    let lookup_start = Instant::now();
55    let css = mdd
56        .lookup("\\LM5style.css")?
57        .ok_or("missing benchmark MDD key")?;
58    let mdd_lookup = lookup_start.elapsed();
59
60    let key_scan_start = Instant::now();
61    let mut mdd_key_count = 0usize;
62    let mut mdd_key_bytes = 0usize;
63    for key in mdd.keys() {
64        let key = key?;
65        mdd_key_count += 1;
66        mdd_key_bytes += key.len();
67    }
68    let mdd_key_scan = key_scan_start.elapsed();
69
70    let entry_scan_start = Instant::now();
71    let mut mdd_entry_count = 0usize;
72    let mut mdd_entry_key_bytes = 0usize;
73    let mut mdd_entry_data_bytes = 0usize;
74    for entry in mdd.entries() {
75        let entry = entry?;
76        mdd_entry_count += 1;
77        mdd_entry_key_bytes += entry.key.len();
78        mdd_entry_data_bytes += entry.data.len();
79    }
80    let mdd_entry_scan = entry_scan_start.elapsed();
81
82    println!("mdx_open_ms={}", mdx_open.as_millis());
83    println!("mdx_lookup_ms_total={}", mdx_lookup.as_millis());
84    println!(
85        "mdx_lookup_ms_avg={:.2}",
86        mdx_lookup.as_secs_f64() * 1000.0 / queries.len() as f64
87    );
88    println!("mdx_total_chars={total_chars}");
89    println!("mdx_keys_scan_ms_total={}", mdx_key_scan.as_millis());
90    println!("mdx_keys_scan_count={mdx_key_count}");
91    println!("mdx_keys_scan_total_bytes={mdx_key_bytes}");
92    println!("mdx_entries_scan_ms_total={}", mdx_entry_scan.as_millis());
93    println!("mdx_entries_scan_count={mdx_entry_count}");
94    println!("mdx_entries_scan_key_bytes={mdx_entry_key_bytes}");
95    println!("mdx_entries_scan_text_bytes={mdx_entry_text_bytes}");
96    println!("mdd_open_ms={}", mdd_open.as_millis());
97    println!("mdd_lookup_ms_total={}", mdd_lookup.as_millis());
98    println!("mdd_css_bytes={}", css.data.len());
99    println!("mdd_keys_scan_ms_total={}", mdd_key_scan.as_millis());
100    println!("mdd_keys_scan_count={mdd_key_count}");
101    println!("mdd_keys_scan_total_bytes={mdd_key_bytes}");
102    println!("mdd_entries_scan_ms_total={}", mdd_entry_scan.as_millis());
103    println!("mdd_entries_scan_count={mdd_entry_count}");
104    println!("mdd_entries_scan_key_bytes={mdd_entry_key_bytes}");
105    println!("mdd_entries_scan_data_bytes={mdd_entry_data_bytes}");
106
107    Ok(())
108}