Seems that `SmallVec::clone` is pretty expensive in a generic case, and specialising it improves the performance quite a bit! Release Notes: - Improved performance of different building blocks within the MultiBuffer. ---------
Showing the changes to crates/buffer_diff/src/buffer_diff.rs (1 of 5 files). Show all
Unified · Split
| @@ -914,28 +914,25 @@ impl BufferDiffInner<language::BufferSnapshot> { · 913 unmodified lines | ||
| 914 | 914 | buffer: &'a text::BufferSnapshot, |
| 915 | 915 | secondary: Option<&'a Self>, |
| 916 | 916 | ) -> impl 'a + Iterator<Item = DiffHunk> { |
| 917 | − let mut cursor = self.hunks.filter::<_, DiffHunkSummary>(buffer, filter); | |
| 918 | − | |
| 919 | − let anchor_iter = iter::from_fn(move || { | |
| 920 | − cursor.next(); | |
| 921 | − cursor.item() | |
| 922 | − }) | |
| 923 | − .flat_map(move |hunk| { | |
| 924 | − [ | |
| 925 | − ( | |
| 926 | − &hunk.buffer_range.start, | |
| 917 | + let anchor_iter = self | |
| 918 | + .hunks | |
| 919 | + .filter::<_, DiffHunkSummary>(buffer, filter) | |
| 920 | + .flat_map(move |hunk| { | |
| 921 | + [ | |
| 927 | 922 | ( |
| 928 | − hunk.buffer_range.start, | |
| 929 | − hunk.diff_base_byte_range.start, | |
| 930 | − hunk, | |
| 923 | + &hunk.buffer_range.start, | |
| 924 | + ( | |
| 925 | + hunk.buffer_range.start, | |
| 926 | + hunk.diff_base_byte_range.start, | |
| 927 | + hunk, | |
| 928 | + ), | |
| 931 | 929 | ), |
| 932 | − ), | |
| 933 | − ( | |
| 934 | − &hunk.buffer_range.end, | |
| 935 | − (hunk.buffer_range.end, hunk.diff_base_byte_range.end, hunk), | |
| 936 | − ), | |
| 937 | − ] | |
| 938 | − }); | |
| 930 | + ( | |
| 931 | + &hunk.buffer_range.end, | |
| 932 | + (hunk.buffer_range.end, hunk.diff_base_byte_range.end, hunk), | |
| 933 | + ), | |
| 934 | + ] | |
| 935 | + }); | |
| 939 | 936 | |
| 940 | 937 | let mut pending_hunks_cursor = self.pending_hunks.cursor::<DiffHunkSummary>(buffer); |
| 941 | 938 | pending_hunks_cursor.next(); |