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 | buffer: &'a text::BufferSnapshot, | 914 | buffer: &'a text::BufferSnapshot, |
| 915 | secondary: Option<&'a Self>, | 915 | secondary: Option<&'a Self>, |
| 916 | ) -> impl 'a + Iterator<Item = DiffHunk> { | 916 | ) -> impl 'a + Iterator<Item = DiffHunk> { |
| 917 | let mut cursor = self.hunks.filter::<_, DiffHunkSummary>(buffer, filter); | 917 | let anchor_iter = self |
| 918 | 918 | .hunks | |
| 919 | let anchor_iter = iter::from_fn(move || { | 919 | .filter::<_, DiffHunkSummary>(buffer, filter) |
| 920 | cursor.next(); | 920 | .flat_map(move |hunk| { |
| 921 | cursor.item() | 921 | [ |
| 922 | }) | ||
| 923 | .flat_map(move |hunk| { | ||
| 924 | [ | ||
| 925 | ( | ||
| 926 | &hunk.buffer_range.start, | ||
| 927 | ( | 922 | ( |
| 928 | hunk.buffer_range.start, | 923 | &hunk.buffer_range.start, |
| 929 | hunk.diff_base_byte_range.start, | 924 | ( |
| 930 | hunk, | 925 | hunk.buffer_range.start, |
| 926 | hunk.diff_base_byte_range.start, | ||
| 927 | hunk, | ||
| 928 | ), | ||
| 931 | ), | 929 | ), |
| 932 | ), | 930 | ( |
| 933 | ( | 931 | &hunk.buffer_range.end, |
| 934 | &hunk.buffer_range.end, | 932 | (hunk.buffer_range.end, hunk.diff_base_byte_range.end, hunk), |
| 935 | (hunk.buffer_range.end, hunk.diff_base_byte_range.end, hunk), | 933 | ), |
| 936 | ), | 934 | ] |
| 937 | ] | 935 | }); |
| 938 | }); | ||
| 939 | 936 | ||
| 940 | let mut pending_hunks_cursor = self.pending_hunks.cursor::<DiffHunkSummary>(buffer); | 937 | let mut pending_hunks_cursor = self.pending_hunks.cursor::<DiffHunkSummary>(buffer); |
| 941 | pending_hunks_cursor.next(); | 938 | pending_hunks_cursor.next(); |