zed/crates
Thorsten Ball 8ec680cecb
project search: Increase perf up to 10x by batching git status calls (#16936)
***Update**: after rebasing on top of
https://github.com/zed-industries/zed/pull/16915/ (that also changed how
search worked), the results are still good, but not 10x. Instead of
going from 10s to 500ms, it goes from 10s to 3s.*

This improves the performance of project-wide search by an order of
magnitude.

After digging in, @as-cii and I found that opening buffers was the
bottleneck for project-wide search (since Zed opens, parses, ... buffers
when finding them, which is something VS Code doesn't do, for example).
So this PR improves the performance of opening multiple buffers at once.

It does this by doing two things:

- It batches scan-requests in the worktree. When we search, we search
files in chunks of 64. Previously we'd handle all 64 scan requests
separately. The new code checks if the scan requests can be batched and
if so it, it does that.
- It batches `git status` calls when reloading the project entries for
the opened buffers. Instead of calling `git status` for each file, it
calls `git status` for a batch of files, and then extracts the status
for each file.

(It has to be said that I think the slow performance on `main` has been
a regression introduced over the last few months with the changes made
to project/worktree/git. I don't think it was this slow ~5 months ago.
But I also don't think it was this fast ~5 months ago.)

## Benchmarks

| Search | Before | After (without
https://github.com/zed-industries/zed/pull/16915) | After (with
https://github.com/zed-industries/zed/pull/16915)
|--------|--------|-------|------|
| `zed.dev` at `2b2a501192e78e`, searching for `<` (`4484` results) |
3.0s<br>2.9s<br>2.89s | 489ms<br>517ms<br>476ms | n/a |
| `zed.dev` at `2b2a501192e78e`, searching for `:` (`25886+` results) |
3.9s<br>3.9s<br>3.8s | 70ms<br>66ms<br>72ms | n/a |
| `zed` at `55dda0e6af`, searching for `<` (`10937+` results) |
10s<br>11s<br>12s | 500m<br>499ms<br>543ms | 3.4s<br>3.1s<br> |

(All results recorded after doing a warm-up run that would start
language servers etc.)

Release Notes:

- Performance of project-wide search has been improved by up to 10x.

---------

Co-authored-by: Antonio <antonio@zed.dev>
2024-08-27 11:59:59 +02:00
..
activity_indicator activity indicator: Do not show indicators background when there's no state (#16737) 2024-08-23 13:04:54 +02:00
anthropic Add tracing needed for LLM rate limit dashboards (#16388) 2024-08-16 17:52:31 -04:00
assets Allow prompt templates to be overridden in the zed configuration directory (#15887) 2024-08-06 19:30:48 -06:00
assistant assistant: Fix model selector check icon overflow (#16716) 2024-08-26 17:32:32 -07:00
assistant_slash_command Fix more bugs in files (#16241) 2024-08-16 10:09:38 -07:00
audio Make tests less noisy (#12463) 2024-05-29 18:06:45 -07:00
auto_update Add is_staff and destination to download events (#15445) 2024-07-29 14:21:29 -04:00
breadcrumbs breadcrumbs: Use early return in set_active_pane_item (#14691) 2024-07-17 18:58:44 -04:00
call chore: Fix clippy violations from Cargo.toml (#15216) 2024-07-25 20:22:01 +02:00
channel Update http crate name (#15041) 2024-07-23 15:01:05 -07:00
cli Add option to pipe from stdin on cli (#16084) 2024-08-22 13:31:58 -06:00
client Fix impersonation in local development (#16755) 2024-08-23 10:49:34 -04:00
clock Lay the groundwork for collaborating on assistant panel (#13991) 2024-07-10 17:36:22 +02:00
collab SSH remote search (#16915) 2024-08-26 14:47:02 -06:00
collab_ui collab panel: Unfocus filter editor on escape (#16579) 2024-08-21 09:38:12 +02:00
collections gpui: Add SVG rendering to img element and generic asset cache (#9931) 2024-03-29 17:09:49 -07:00
command_palette command_palette: Remove project as a dependency in Cargo.toml (#16082) 2024-08-12 13:01:32 -04:00
command_palette_hooks Introduce InlineCompletionProvider (#9777) 2024-03-26 13:28:06 +01:00
context_servers context_servers: Log errors from detached context server tasks (#16377) 2024-08-16 13:50:19 -07:00
copilot Fix manual copilot with show_inline_completions: false (#16621) 2024-08-21 20:27:19 -06:00
db Replace lazy_static with std::sync::LazyLock (#16066) 2024-08-20 14:27:33 -04:00
dev_server_projects remoting: Allow Add/Remove remote folder (#14532) 2024-07-16 12:01:59 -06:00
diagnostics assistant: Polish /workflow and steps UI (#15936) 2024-08-08 15:46:33 +02:00
docs_preprocessor Don't rely on relative path for docs preprocessor (#16883) 2024-08-26 11:43:13 -04:00
editor vim: Add Smart Relative Line Number (#16567) 2024-08-26 21:17:21 -06:00
extension extension: Add more logging when building extensions (#16794) 2024-08-26 11:18:06 -04:00
extension_api zed_extension_api: Start a list of pending changes (#16305) 2024-08-15 13:10:46 -04:00
extension_cli Provide user agent when performing HTTP requests (#15470) 2024-07-30 11:12:37 +02:00
extensions_ui Feature/fallback fonts (#15306) 2024-07-26 16:42:21 -07:00
feature_flags Add logic for closed beta LLM models (#16482) 2024-08-19 11:09:52 -07:00
feedback Rename is_local to is_local_or_ssh (#16717) 2024-08-22 21:32:51 -06:00
file_finder Rename is_local to is_local_or_ssh (#16717) 2024-08-22 21:32:51 -06:00
file_icons chore: Clean up allocs around project panel (#15422) 2024-07-29 14:21:41 +02:00
fs Fix git repository state corruption when work dir's metadata is updated (#16926) 2024-08-26 17:46:50 -07:00
fsevent Retain run loop (#11241) 2024-04-30 23:31:59 -06:00
fuzzy Improve slash commands (#16195) 2024-08-13 23:06:07 -07:00
git project search: Increase perf up to 10x by batching git status calls (#16936) 2024-08-27 11:59:59 +02:00
git_hosting_providers Update http crate name (#15041) 2024-07-23 15:01:05 -07:00
go_to_line Show correct number of characters selected (#16420) 2024-08-18 02:24:32 +03:00
google_ai Authorize access to language model providers based on country (#15859) 2024-08-06 11:49:04 -04:00
gpui blade: Align rasterized path bounds to whole pixels (#16784) 2024-08-27 01:26:59 +03:00
gpui_macros Use US English spelling of "behavior" and "customize" (#15117) 2024-07-24 16:36:01 -04:00
headless remoting: Allow Add/Remove remote folder (#14532) 2024-07-16 12:01:59 -06:00
html_to_markdown Publish html_to_markdown (#13718) 2024-07-01 17:18:58 -04:00
http_client Introduce a separate backend service for LLM calls (#15831) 2024-08-05 20:26:21 -04:00
image_viewer Add text_color helper for tab contents (#14737) 2024-07-18 09:27:05 -04:00
indexed_docs indexed_docs: Normalize - in crate names to _ when computing rustdoc output path (#16234) 2024-08-14 12:37:02 -04:00
inline_completion_button inline_completion_button: Do some cleanup (#15849) 2024-08-06 08:55:27 -04:00
install_cli Fix flickering (#9012) 2024-03-11 10:45:57 +01:00
journal Add the ability for extensions to provide language settings (#10296) 2024-04-08 19:17:12 -04:00
language language: Do not fetch diagnostics when iterating over text without language awareness (#16824) 2024-08-25 18:02:54 +02:00
language_model Remove reference to Copilot plugin (#16916) 2024-08-26 16:43:22 -04:00
language_selector Move Clippy configuration to the workspace level (#8891) 2024-03-05 12:01:17 -05:00
language_tools Rename is_local to is_local_or_ssh (#16717) 2024-08-22 21:32:51 -06:00
languages yaml: Add single quotes to list of brackets (#16859) 2024-08-26 18:02:40 +02:00
live_kit_client live_kit_client: Suppress clippy::arc_with_non_send_sync (#16298) 2024-08-15 11:46:43 -04:00
live_kit_server live_kit_server: Re-remove protocol submodule (#15317) 2024-07-26 21:10:56 -04:00
lsp chore: Bump Rust version to 1.80 (#15186) 2024-07-25 22:48:42 +02:00
markdown Fix a panic when diagnostics contain multiple links (#16601) 2024-08-21 11:18:43 -06:00
markdown_preview markdown preview: Detect language of buffer correctly (#15961) 2024-08-08 11:53:37 +02:00
media linux: Better GPU debugging (#14706) 2024-07-23 09:56:45 -06:00
menu open picker (#14524) 2024-07-15 17:04:15 -06:00
multi_buffer assistant: Undo workflow step when buffer is discarded (#16465) 2024-08-19 18:42:49 +02:00
node_runtime windows: Fix eslint installation (#15331) 2024-07-27 10:24:05 -04:00
notifications chore: Remove a bunch of unused structs (#16139) 2024-08-13 01:43:19 +02:00
ollama ollama: Support model context_size (num_ctx) >2048 (#16877) 2024-08-26 11:09:47 -04:00
open_ai Add max_output_tokens to OpenAI models and integrate into requests (#16381) 2024-08-21 00:39:10 -04:00
outline Handle buffer diff base updates and file renames properly for SSH projects (#14989) 2024-07-23 11:32:37 -07:00
outline_panel Display buffer/project search entries in the outline panel (#16589) 2024-08-25 21:40:02 +03:00
paths Improve dev experience for built-in prompts (#16413) 2024-08-17 12:28:53 -06:00
performance Add a setting to show time to first window draw and frames per second in status bar (#16422) 2024-08-18 15:22:19 -06:00
picker assistant: Add the "create your command" item (#16467) 2024-08-19 12:29:16 -03:00
prettier Lookup prettier more leniently (#14403) 2024-07-13 21:59:14 +03:00
project Restore missing fifo check (#16931) 2024-08-26 21:17:44 -06:00
project_panel Fix fifo files hanging the project wide search (#16039) 2024-08-26 10:40:20 -06:00
project_symbols Start on adding support for editing via the assistant panel (#14795) 2024-07-19 11:13:15 +02:00
proto SSH remote search (#16915) 2024-08-26 14:47:02 -06:00
quick_action_bar Improve Linux terminal keymap and context menu (#16845) 2024-08-26 01:01:46 +03:00
recent_projects recent_project: Fix overflow sub (#15965) 2024-08-08 15:58:59 +02:00
refineable Move Clippy configuration to the workspace level (#8891) 2024-03-05 12:01:17 -05:00
release_channel auto-updates: Do not poll for updates on dev channel (#13311) 2024-06-20 15:00:54 +02:00
remote SSH remoting: terminal & tasks (#15321) 2024-07-28 22:45:00 -06:00
remote_server SSH remote search (#16915) 2024-08-26 14:47:02 -06:00
repl REPL: Refactor output (#16927) 2024-08-26 18:03:06 -07:00
rich_text chore: Bump Rust version to 1.80 (#15186) 2024-07-25 22:48:42 +02:00
rope Skip over folded regions when iterating over multibuffer chunks (#15646) 2024-08-02 19:51:26 +02:00
rpc Apply rate limits in LLM service (#15997) 2024-08-08 15:46:33 -07:00
search SSH remote search (#16915) 2024-08-26 14:47:02 -06:00
semantic_index Allow customization of the model used for tool calling (#15479) 2024-07-30 16:18:53 +02:00
semantic_version Extract SemanticVersion into its own crate (#9956) 2024-03-29 12:11:57 -04:00
session zed: Persist window stack order across restarts (#15419) 2024-07-29 17:05:56 +02:00
settings Don't rely on relative path for docs preprocessor (#16883) 2024-08-26 11:43:13 -04:00
settings_ui ui: Apply elevation outside SettingsContainer (#15346) 2024-07-27 14:00:03 -04:00
snippet Correct escaping in snippets (#14912) 2024-07-22 00:57:34 +02:00
snippet_provider extensions: Add support for snippets provided by extensions (#14020) 2024-07-10 09:40:50 +02:00
sqlez Replace lazy_static with std::sync::LazyLock (#16066) 2024-08-20 14:27:33 -04:00
sqlez_macros Replace lazy_static with std::sync::LazyLock (#16066) 2024-08-20 14:27:33 -04:00
story stories: Get OverflowScrollStory to scroll again (#15982) 2024-08-09 12:32:26 +02:00
storybook Docs Party 2024 (#15876) 2024-08-09 13:37:54 -04:00
sum_tree Restore "Avoid buffering line content to compute indent guides" (#15284) 2024-07-28 10:52:39 +02:00
supermaven windows: Fix supermaven (#16203) 2024-08-14 17:01:16 +03:00
supermaven_api windows: Fix supermaven (#16203) 2024-08-14 17:01:16 +03:00
tab_switcher Implement "join pane into next" (#16077) 2024-08-27 00:51:51 +03:00
task SSH remoting: terminal & tasks (#15321) 2024-07-28 22:45:00 -06:00
tasks_ui Rename is_local to is_local_or_ssh (#16717) 2024-08-22 21:32:51 -06:00
telemetry_events docs: Update telemetry documentation (#16628) 2024-08-21 20:24:35 -04:00
terminal Do not hold any tasks by default and no other terminals (#16847) 2024-08-27 01:48:34 +03:00
terminal_view Implement "join pane into next" (#16077) 2024-08-27 00:51:51 +03:00
text assistant: Normalize line endings for prompts loaded from templates (#16808) 2024-08-26 10:34:20 -04:00
theme theme: Fallback to opaque color for title_bar.inactive_background (#16833) 2024-08-26 10:26:47 -04:00
theme_importer Hoist strum to workspace level (#15243) 2024-07-25 21:30:48 -04:00
theme_selector settings_ui: Add theme settings controls (#15115) 2024-07-24 16:25:52 -04:00
time_format Inline git blame (#10398) 2024-04-15 14:21:52 +02:00
title_bar Rename is_local to is_local_or_ssh (#16717) 2024-08-22 21:32:51 -06:00
ui Display buffer/project search entries in the outline panel (#16589) 2024-08-25 21:40:02 +03:00
ui_input Rename ui_text_field crate to ui_input (#13949) 2024-07-08 17:05:30 -04:00
util Fix more bugs in files (#16241) 2024-08-16 10:09:38 -07:00
vcs_menu Adjust list item & pickers spacing (#14250) 2024-07-15 10:23:18 -03:00
vim vim: Add Smart Relative Line Number (#16567) 2024-08-26 21:17:21 -06:00
welcome assistant: Overhaul provider infrastructure (#14929) 2024-07-23 19:48:41 +02:00
workspace Implement "join pane into next" (#16077) 2024-08-27 00:51:51 +03:00
worktree project search: Increase perf up to 10x by batching git status calls (#16936) 2024-08-27 11:59:59 +02:00
zed Do not hold any tasks by default and no other terminals (#16847) 2024-08-27 01:48:34 +03:00
zed_actions Improve Linux terminal keymap and context menu (#16845) 2024-08-26 01:01:46 +03:00