# editor: Skip multi-cursor selection broadcast when unshared \(\#60605\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/4612aa2febc9035d61374982a96101f300df619d)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: 4612aa2febc9035d61374982a96101f300df619d

Requested commit: 4612aa2febc9035d61374982a96101f300df619d

Commit: 4612aa2febc9035d61374982a96101f300df619d

Tree: 56847ba05e3f09d8865684744f2c232755588c9c

Author: Rani

Committer: GitHub

## Message

```
editor: Skip multi-cursor selection broadcast when unshared (#60605)

Resubmit of #59731, which got auto-closed when I accidentally deleted
its branch. It wasn't rejected, it had already been reviewed. This is
rebased onto latest `main`, and osiewicz's review feedback (using `_`
for the unused param in the trait default) is already in.

Follow-up to #58510. Profiling multi-cursor typing on current main
showed the per-keystroke `set_active_selections` broadcast 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's no regression:

- 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 `set_active_selections` in `selections_did_change` on it.
Follow-mode is unaffected since it uses the separate
UpdateFollowers/UpdateView channel, and the focused user's own cursors
render from `editor.selections`, not `remote_selections`.
- When the project becomes (re)shared (`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.
- Reuse the post-edit display snapshot in the `hard_wrap` branch 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:
https://github.com/zed-industries/zed/issues/32051

Release Notes:

- Improved multi cursor editing performance
```

## Parents

- [f29c8eaf13682ef5a4a70a81eb4838b247cf7211](https://git.cafe/gitcafe/zed/commit/f29c8eaf13682ef5a4a70a81eb4838b247cf7211?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/4612aa2febc9035d61374982a96101f300df619d?format=markdown)
