editor: Skip multi-cursor selection broadcast when unshared - #59731
Closed
Rani367 wants to merge 3 commits into
Closed
editor: Skip multi-cursor selection broadcast when unshared#59731Rani367 wants to merge 3 commits into
Rani367 wants to merge 3 commits into
Conversation
Rani367
marked this pull request as ready for review
June 24, 2026 17:52
The per-keystroke `set_active_selections` broadcast does an O(selections) multi-buffer anchor remap and runs even with zero collaborators. Profiling multi-cursor typing showed it costs ~0.9ms/call at 1k cursors and ~8.4ms at 10k, fired ~3x per edited iteration — pure overhead when nobody is observing. - Add `CollaborationHub::should_broadcast_selections`, defaulting to `true`. `Entity<Project>` overrides it to `Project::is_shared()`, which is true for a host that shared the project and for a collab guest, and stays correct before peer-join notifications have propagated locally (unlike a live collaborator count). A purely local project has no audience. - Gate the `set_active_selections` call in `selections_did_change` on it. Follow-mode is unaffected (it uses the separate UpdateFollowers/UpdateView channel); the focused user's own cursors render from `editor.selections`, not `remote_selections`. - input: reuse the post-edit display snapshot in the `hard_wrap` branch instead of taking a redundant fresh buffer snapshot. ~5% faster multi-cursor type+delete at both 1k and 10k cursors (615->583ms at 10k, significant). All 773 editor tests pass.
The previous commit skips the per-keystroke selection broadcast while a project is unshared. On its own that means a peer joining right after the host shares the project would not see the host's cursor until the host next moved it. Re-publish the focused editor's current selections when the project emits RemoteIdChanged(Some), Reshared, or HostReshared, reusing the same focus and leader gating as the per-change broadcast. Addresses review feedback on zed-industries#32051.
Rani367
force-pushed
the
multicursor-perf-track-a
branch
from
June 30, 2026 19:40
0460cb2 to
fbc1ce9
Compare
osiewicz
reviewed
Jul 2, 2026
Comment on lines
+11110
to
+11111
| fn should_broadcast_selections(&self, cx: &App) -> bool { | ||
| let _ = cx; |
Member
There was a problem hiding this comment.
Suggested change
| fn should_broadcast_selections(&self, cx: &App) -> bool { | |
| let _ = cx; | |
| fn should_broadcast_selections(&self, _: &App) -> bool { |
…efault Address review feedback on zed-industries#59731 (osiewicz).
Contributor
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-up to #58510. Profiling multi-cursor typing on current main showed the per-keystroke
set_active_selectionsbroadcast does an O(selections) multi-buffer anchor remap and runs even with zero collaborators (about 0.9ms/call at 1k cursors, 8.4ms at 10k, fired ~3x per edited iteration).This skips the broadcast when the buffer has no audience, and re-publishes on share so there is no regression:
CollaborationHub::should_broadcast_selections, defaulting totrue.Entity<Project>overrides it toProject::is_shared(), which is true for a host that shared the project and for a collab guest, and stays correct before peer-join notifications have propagated locally (unlike a live collaborator count). A purely local project has no audience.set_active_selectionsinselections_did_changeon it. Follow-mode is unaffected since it uses the separate UpdateFollowers/UpdateView channel, and the focused user's own cursors render fromeditor.selections, notremote_selections.RemoteIdChanged(Some),Reshared,HostReshared), the focused editor re-publishes its current selections, so a peer joining after a share still sees the host's cursor without waiting for the next selection change.hard_wrapbranch instead of taking a redundant fresh buffer snapshot.Multi-cursor type+delete benchmark: about 5% faster at both 1k and 10k cursors (615 to 583 ms at 10k, significant). All 773 editor tests pass locally. Collab and channel-buffer integration tests need the test DB, so they run on CI.
Discussion and profiling: #32051
Release Notes: