use editor::{ Editor, EditorMode, MultiBuffer, actions::{DeleteToPreviousWordStart, SelectAll, SplitSelectionIntoLines}, }; use gpui::{AppContext as _, BenchAppContext, Focusable as _}; use rand::{Rng as _, SeedableRng as _, rngs::StdRng}; use settings::SettingsStore; use util::RandomCharIter; use zed_actions::editor::{MoveDown, MoveUp}; #[gpui::bench( inputs = multi_cursor_line_counts(), group = "Multi-cursor input", input_name = "cursors", sample_size = 10 )] fn editor_multi_cursor_input(line_count: &usize, cx: &mut BenchAppContext) { init_context(cx); let text = "line:\n".repeat(*line_count); let buffer = cx.update(|cx| MultiBuffer::build_simple(&text, cx)); let mut window = cx.add_empty_window(); let editor = window.update(|window, cx| { let editor = cx.new(|cx| { let mut editor = Editor::new(EditorMode::full(), buffer, None, window, cx); editor.set_style(editor::EditorStyle::default(), window, cx); editor.select_all(&SelectAll, window, cx); editor.split_selection_into_lines( &SplitSelectionIntoLines { keep_selections: true, }, window, cx, ); editor }); window.focus(&editor.focus_handle(cx), cx); editor }); cx.bench_iter(|_| { window.update(|window, cx| { editor.update(cx, |editor, cx| { editor.handle_input("hello world", window, cx); editor.delete_to_previous_word_start( &DeleteToPreviousWordStart { ignore_newlines: false, ignore_brackets: false, }, window, cx, ); editor.delete_to_previous_word_start( &DeleteToPreviousWordStart { ignore_newlines: false, ignore_brackets: false, }, window, cx, ); }); }) }); } #[gpui::bench] fn open_editor_with_one_long_line(cx: &mut BenchAppContext) { init_context(cx); let text = String::from_iter(["char"; 1000]); cx.bench_iter(move |cx| { let buffer = cx.update(|cx| MultiBuffer::build_simple(&text, cx)); let mut window = cx.add_empty_window(); window.update(|window, cx| { let editor = cx.new(|cx| { let mut editor = Editor::new(EditorMode::full(), buffer, None, window, cx); editor.set_style(editor::EditorStyle::default(), window, cx); editor }); window.focus(&editor.focus_handle(cx), cx); editor }); }); } #[gpui::bench] fn editor_render(cx: &mut BenchAppContext) { init_context(cx); let buffer = cx.update(|cx| { let mut rng = StdRng::seed_from_u64(1); let text_len = rng.random_range(10000..90000); if rng.random() { let text = RandomCharIter::new(&mut rng) .take(text_len) .collect::(); MultiBuffer::build_simple(&text, cx) } else { MultiBuffer::build_random(&mut rng, cx) } }); let mut window = cx.add_empty_window(); let editor = window.update(|window, cx| { let editor = window.replace_root(cx, |window, cx| { let mut editor = Editor::new(EditorMode::full(), buffer, None, window, cx); editor.set_style(editor::EditorStyle::default(), window, cx); editor }); window.focus(&editor.focus_handle(cx), cx); editor }); let mut move_down = true; cx.bench_renderer(editor, move |editor, window, cx| { if move_down { editor.move_down(&MoveDown, window, cx); } else { editor.move_up(&MoveUp, window, cx); } move_down = !move_down; }); } fn init_context(cx: &mut BenchAppContext) { cx.update(|cx| { let store = SettingsStore::test(cx); cx.set_global(store); assets::Assets.load_test_fonts(cx); theme_settings::init(theme::LoadThemes::JustBase, cx); editor::init(cx); }); } fn multi_cursor_line_counts() -> Vec { let mut line_counts = vec![1000, 10000]; if std::env::var("ZED_BENCH_HUGE").is_ok() { line_counts.push(100000); } line_counts } gpui::bench_group!( benches, editor_multi_cursor_input, open_editor_with_one_long_line, editor_render ); gpui::bench_main!(benches);