1use criterion::{Criterion, criterion_group, criterion_main};
2use project::{Entry, EntryKind, GitEntry, ProjectEntryId};
3use project_panel::par_sort_worktree_entries;
4use settings::{ProjectPanelSortMode, ProjectPanelSortOrder};
5use std::sync::Arc;
6use util::rel_path::RelPath;
7
8fn load_linux_repo_snapshot() -> Vec<GitEntry> {
9 let file = std::fs::read_to_string(concat!(
10 env!("CARGO_MANIFEST_DIR"),
11 "/benches/linux_repo_snapshot.txt"
12 ))
13 .expect("Failed to read file");
14 file.lines()
15 .filter_map(|line| {
16 let kind = match line.chars().next() {
17 Some('f') => EntryKind::File,
18 Some('d') => EntryKind::Dir,
19 _ => return None,
20 };
21
22 let entry = Entry {
23 kind,
24 path: Arc::from(RelPath::unix(&(line.trim_end()[2..])).unwrap()),
25 id: ProjectEntryId::default(),
26 size: 0,
27 inode: 0,
28 mtime: None,
29 canonical_path: None,
30 is_ignored: false,
31 is_always_included: false,
32 is_external: false,
33 is_private: false,
34 is_hidden: false,
35 char_bag: Default::default(),
36 is_fifo: false,
37 };
38 Some(GitEntry {
39 entry,
40 git_summary: Default::default(),
41 })
42 })
43 .collect()
44}
45fn criterion_benchmark(c: &mut Criterion) {
46 let snapshot = load_linux_repo_snapshot();
47
48 let modes = [
49 ("DirectoriesFirst", ProjectPanelSortMode::DirectoriesFirst),
50 ("Mixed", ProjectPanelSortMode::Mixed),
51 ("FilesFirst", ProjectPanelSortMode::FilesFirst),
52 ];
53 let orders = [
54 ("Default", ProjectPanelSortOrder::Default),
55 ("Upper", ProjectPanelSortOrder::Upper),
56 ("Lower", ProjectPanelSortOrder::Lower),
57 ("Unicode", ProjectPanelSortOrder::Unicode),
58 ];
59
60 for (mode_name, mode) in &modes {
61 for (order_name, order) in &orders {
62 c.bench_function(
63 &format!("Sort linux worktree snapshot ({mode_name}, {order_name})"),
64 |b| {
65 b.iter_batched(
66 || snapshot.clone(),
67 |mut snapshot| par_sort_worktree_entries(&mut snapshot, *mode, *order),
68 criterion::BatchSize::LargeInput,
69 );
70 },
71 );
72 }
73 }
74}
75
76criterion_group!(benches, criterion_benchmark);
77criterion_main!(benches);