sorting.rs

 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);