Skip to content

Commit 6b23703

Browse files
committed
perf: avoid monomorphizing <[BNode]>::reverse in non-hydration path
Use into_iter().rev() (pointer arithmetic on DoubleEndedIterator) instead of in-place slice reverse (element-sized swap loops).
1 parent 6c16df7 commit 6b23703

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

packages/yew/src/dom_bundle/blist.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,18 +176,17 @@ impl BList {
176176
let mut lefts_rev = lefts.into_iter().rev();
177177

178178
// Add excess new nodes at the tail of render order (rightmost first
179-
// for the NodeWriter).
180-
let excess_start = rights.len();
179+
// for the NodeWriter, then extended in render order).
180+
let mut excess: Vec<BNode> = Vec::new();
181181
for l in lefts_rev
182182
.by_ref()
183183
.take(left_len.saturating_sub(paired_count))
184184
{
185185
let (next_writer, el) = writer.add(l);
186-
rights.push(el);
186+
excess.push(el);
187187
writer = next_writer;
188188
}
189-
// Items were pushed right-to-left; flip to render order.
190-
rights[excess_start..].reverse();
189+
rights.extend(excess.into_iter().rev());
191190

192191
// Patch paired nodes right-to-left.
193192
for (l, r) in lefts_rev.zip(rights[..paired_count].iter_mut().rev()) {
@@ -410,11 +409,13 @@ impl BList {
410409
};
411410
replacements.push(bundle);
412411
}
413-
// drop the splice iterator and immediately replace the range with the reordered elements
412+
// drop the splice iterator and immediately replace the range with the reordered elements.
413+
// replacements was built right-to-left; iterate in reverse for render order.
414414
drop(spliced_middle);
415-
// replacements was built right-to-left; reverse to render order
416-
replacements.reverse();
417-
bundles.splice(matching_len_start..matching_len_start, replacements);
415+
bundles.splice(
416+
matching_len_start..matching_len_start,
417+
replacements.into_iter().rev(),
418+
);
418419

419420
// Step 2.3. Remove any extra rights
420421
for KeyedEntry(_, r) in spare_bundles.drain() {

0 commit comments

Comments
 (0)