bench_local/
bench_local.rs1use 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}