Skip to main content

indexing_editing_benchmark/
indexing_editing_benchmark.rs

1use 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}