indexing_editing_benchmark/
indexing_editing_benchmark.rs1use std::{hint::black_box, sync::Arc, time::Instant};
2
3use zirium::{
4 dialect::DialectRegistry,
5 parser::ParsedFile,
6 semantic::{LoweringMode, lower_with_dialect_registry},
7};
8
9const OPERATIONS: usize = 2_000;
10
11fn main() {
12 let constants = OPERATIONS / 2;
13 let mut source = String::from("builtin.module { func.func @bench() -> i32 {\n");
14 for index in 0..constants {
15 source.push_str(&format!("%v{index} = arith.constant {index} : i32\n"));
16 }
17 for index in constants..OPERATIONS {
18 source.push_str(&format!(
19 "%v{index} = arith.addi %v{}, %v0 : i32\n",
20 index - 1
21 ));
22 }
23 source.push_str(&format!("func.return %v{} : i32\n}} }}", OPERATIONS - 1));
24 let start = Instant::now();
25 let parsed = ParsedFile::parse_with_registry(
26 Arc::<[u8]>::from(source.into_bytes()),
27 DialectRegistry::baseline(),
28 )
29 .unwrap();
30 let parse_ns = start.elapsed().as_nanos();
31 let start = Instant::now();
32 let mut document =
33 lower_with_dialect_registry(&parsed, LoweringMode::Strict, DialectRegistry::baseline())
34 .document
35 .unwrap();
36 let lower_ns = start.elapsed().as_nanos();
37 let parse_only = document.statistics();
38
39 let operations = document.operations().collect::<Vec<_>>();
40 let first = operations
41 .iter()
42 .copied()
43 .find(|operation| document.operation_name(*operation) == Some("arith.constant"))
44 .unwrap();
45 let first_value = document.operation(first).unwrap().result(first, 0).unwrap();
46 let start = Instant::now();
47 black_box(document.uses(first_value));
48 let use_index_ns = start.elapsed().as_nanos();
49 let start = Instant::now();
50 black_box(document.symbol_index_diagnostics(DialectRegistry::baseline()));
51 let symbol_index_ns = start.elapsed().as_nanos();
52 let last = operations
53 .iter()
54 .copied()
55 .rev()
56 .find(|operation| document.operation_name(*operation) == Some("arith.addi"))
57 .unwrap();
58 let start = Instant::now();
59 black_box(document.dominates(first_value, last, DialectRegistry::baseline()));
60 let dominance_index_ns = start.elapsed().as_nanos();
61 let indexed = document.statistics();
62 let second = operations
63 .iter()
64 .copied()
65 .filter(|operation| document.operation_name(*operation) == Some("arith.constant"))
66 .nth(1)
67 .unwrap();
68 let mut editor = document.edit(DialectRegistry::baseline()).unwrap();
69 let second_value = editor
70 .document()
71 .operation(second)
72 .unwrap()
73 .result(second, 0)
74 .unwrap();
75 for value in [second_value, first_value].into_iter().cycle().take(20) {
76 editor.rewire_operand(last, 1, value).unwrap();
77 }
78 let before = editor.document().statistics().pooled_list_entries;
79 let start = Instant::now();
80 let reclaimed = editor.compact_pools();
81 let compaction_ns = start.elapsed().as_nanos();
82 editor.commit().unwrap();
83
84 println!(
85 "operations={OPERATIONS} parse_ns={parse_ns} lower_ns={lower_ns} parse_only_index_entries={} use_index_ns={use_index_ns} symbol_index_ns={symbol_index_ns} dominance_index_ns={dominance_index_ns} indexed_entries={} pooled_before={before} pooled_reclaimed={reclaimed} compaction_ns={compaction_ns}",
86 parse_only.use_index_entries
87 + parse_only.symbol_index_entries
88 + parse_only.dominance_index_entries,
89 indexed.use_index_entries + indexed.symbol_index_entries + indexed.dominance_index_entries,
90 );
91}