highlight_map.rs

  1use criterion::{BenchmarkId, Criterion, black_box, criterion_group, criterion_main};
  2use gpui::rgba;
  3use language::build_highlight_map;
  4use theme::SyntaxTheme;
  5
  6fn syntax_theme(highlight_names: &[&str]) -> SyntaxTheme {
  7    SyntaxTheme::new(highlight_names.iter().enumerate().map(|(i, name)| {
  8        let r = ((i * 37) % 256) as u8;
  9        let g = ((i * 53) % 256) as u8;
 10        let b = ((i * 71) % 256) as u8;
 11        let color = rgba(u32::from_be_bytes([r, g, b, 0xff]));
 12        (name.to_string(), color.into())
 13    }))
 14}
 15
 16static SMALL_THEME_KEYS: &[&str] = &[
 17    "comment", "function", "keyword", "string", "type", "variable",
 18];
 19
 20static LARGE_THEME_KEYS: &[&str] = &[
 21    "attribute",
 22    "boolean",
 23    "comment",
 24    "comment.doc",
 25    "constant",
 26    "constant.builtin",
 27    "constructor",
 28    "embedded",
 29    "emphasis",
 30    "emphasis.strong",
 31    "function",
 32    "function.builtin",
 33    "function.method",
 34    "function.method.builtin",
 35    "function.special.definition",
 36    "keyword",
 37    "keyword.control",
 38    "keyword.control.conditional",
 39    "keyword.control.import",
 40    "keyword.control.repeat",
 41    "keyword.control.return",
 42    "keyword.modifier",
 43    "keyword.operator",
 44    "label",
 45    "link_text",
 46    "link_uri",
 47    "number",
 48    "operator",
 49    "property",
 50    "punctuation",
 51    "punctuation.bracket",
 52    "punctuation.delimiter",
 53    "punctuation.list_marker",
 54    "punctuation.special",
 55    "string",
 56    "string.escape",
 57    "string.regex",
 58    "string.special",
 59    "string.special.symbol",
 60    "tag",
 61    "text.literal",
 62    "title",
 63    "type",
 64    "type.builtin",
 65    "type.super",
 66    "variable",
 67    "variable.builtin",
 68    "variable.member",
 69    "variable.parameter",
 70    "variable.special",
 71];
 72
 73static SMALL_CAPTURE_NAMES: &[&str] = &[
 74    "function",
 75    "keyword",
 76    "string.escape",
 77    "type.builtin",
 78    "variable.builtin",
 79];
 80
 81static LARGE_CAPTURE_NAMES: &[&str] = &[
 82    "attribute",
 83    "boolean",
 84    "comment",
 85    "comment.doc",
 86    "constant",
 87    "constant.builtin",
 88    "constructor",
 89    "function",
 90    "function.builtin",
 91    "function.method",
 92    "keyword",
 93    "keyword.control",
 94    "keyword.control.conditional",
 95    "keyword.control.import",
 96    "keyword.modifier",
 97    "keyword.operator",
 98    "label",
 99    "number",
100    "operator",
101    "property",
102    "punctuation.bracket",
103    "punctuation.delimiter",
104    "punctuation.special",
105    "string",
106    "string.escape",
107    "string.regex",
108    "string.special",
109    "tag",
110    "type",
111    "type.builtin",
112    "variable",
113    "variable.builtin",
114    "variable.member",
115    "variable.parameter",
116];
117
118fn bench_build_highlight_map(c: &mut Criterion) {
119    let mut group = c.benchmark_group("build_highlight_map");
120
121    for (capture_label, capture_names) in [
122        ("small_captures", SMALL_CAPTURE_NAMES as &[&str]),
123        ("large_captures", LARGE_CAPTURE_NAMES as &[&str]),
124    ] {
125        for (theme_label, theme_keys) in [
126            ("small_theme", SMALL_THEME_KEYS as &[&str]),
127            ("large_theme", LARGE_THEME_KEYS as &[&str]),
128        ] {
129            let theme = syntax_theme(theme_keys);
130            group.bench_with_input(
131                BenchmarkId::new(capture_label, theme_label),
132                &(capture_names, &theme),
133                |b, (capture_names, theme)| {
134                    b.iter(|| build_highlight_map(black_box(capture_names), black_box(theme)));
135                },
136            );
137        }
138    }
139
140    group.finish();
141}
142
143criterion_group!(benches, bench_build_highlight_map);
144criterion_main!(benches);