Skip to content

Commit e770beb

Browse files
committed
Generated layout code: reduce memory allocations by not calling instances_vec()
We can use instance_at() instead, without allocating a vector first. This means using a `for i in 0..len` loop, which isn't usual in Rust, but I think it makes sense here, to improve performance.
1 parent ed6afa6 commit e770beb

File tree

1 file changed

+30
-19
lines changed

1 file changed

+30
-19
lines changed

internal/compiler/generator/rust.rs

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3667,7 +3667,7 @@ fn generate_common_repeater_code(
36673667
let ri_idx = *repeated_indices_size;
36683668
repeater_code = quote!(
36693669
#ri[#ri_idx] = #items_vec_ident.len() as u32;
3670-
#ri[#ri_idx + 1] = internal_vec.len() as u32;
3670+
#ri[#ri_idx + 1] = _self.#repeater_id.len() as u32;
36713671
);
36723672
*repeated_indices_size += 2;
36733673
if let Some(rs) = repeater_steps_var_name {
@@ -3680,7 +3680,6 @@ fn generate_common_repeater_code(
36803680
#inner_component_id::FIELD_OFFSETS.#repeater_id.apply_pin(_self).ensure_updated(
36813681
|| { #rep_inner_component_id::new(_self.self_weak.get().unwrap().clone()).unwrap().into() }
36823682
);
3683-
let internal_vec = _self.#repeater_id.instances_vec();
36843683
#repeater_code
36853684
)
36863685
}
@@ -3740,13 +3739,17 @@ fn generate_with_grid_input_data(
37403739
);
37413740

37423741
let new_row = repeater.new_row;
3742+
let repeater_id = format_ident!("repeater{}", usize::from(repeater.repeater_index));
37433743
let loop_code = quote!({
3744+
let len = _self.#repeater_id.len();
37443745
let start_offset = items_vec.len();
3745-
items_vec.extend(core::iter::repeat_with(Default::default).take(internal_vec.len() * #repeated_item_count));
3746-
for (i, sub_comp) in internal_vec.iter().enumerate() {
3747-
let offset = start_offset + i * #repeated_item_count;
3748-
sub_comp.as_pin_ref().grid_layout_input_data(new_row, &mut items_vec[offset..offset + #repeated_item_count]);
3749-
new_row = false;
3746+
items_vec.extend(core::iter::repeat_with(Default::default).take(len * #repeated_item_count));
3747+
for i in 0..len {
3748+
if let Some(sub_comp) = _self.#repeater_id.instance_at(i) {
3749+
let offset = start_offset + i * #repeated_item_count;
3750+
sub_comp.as_pin_ref().grid_layout_input_data(new_row, &mut items_vec[offset..offset + #repeated_item_count]);
3751+
new_row = false;
3752+
}
37503753
}
37513754
});
37523755
push_code.push(quote!(
@@ -3814,19 +3817,24 @@ fn generate_with_layout_item_info(
38143817
"items_vec",
38153818
ctx,
38163819
);
3820+
let repeater_id = format_ident!("repeater{}", usize::from(repeater.repeater_index));
38173821
let loop_code = match repeater.repeated_children_count {
38183822
None => {
38193823
quote!(
3820-
for sub_comp in &internal_vec {
3821-
items_vec.push(sub_comp.as_pin_ref().layout_item_info(#orientation, None));
3824+
for i in 0.._self.#repeater_id.len() {
3825+
if let Some(sub_comp) = _self.#repeater_id.instance_at(i) {
3826+
items_vec.push(sub_comp.as_pin_ref().layout_item_info(#orientation, None));
3827+
}
38223828
}
38233829
)
38243830
}
38253831
Some(count) if count > 0 => {
38263832
quote!(
3827-
for sub_comp in &internal_vec {
3828-
for child_idx in 0..#count {
3829-
items_vec.push(sub_comp.as_pin_ref().layout_item_info(#orientation, Some(child_idx)));
3833+
for i in 0.._self.#repeater_id.len() {
3834+
if let Some(sub_comp) = _self.#repeater_id.instance_at(i) {
3835+
for child_idx in 0..#count {
3836+
items_vec.push(sub_comp.as_pin_ref().layout_item_info(#orientation, Some(child_idx)));
3837+
}
38303838
}
38313839
}
38323840
)
@@ -3900,13 +3908,16 @@ fn generate_with_flexbox_layout_item_info(
39003908
"items_vec_h", // Use items_vec_h for length tracking (same as items_vec_v)
39013909
ctx,
39023910
);
3903-
let loop_code = quote!(for sub_comp in &internal_vec {
3904-
items_vec_h.push(
3905-
sub_comp.as_pin_ref().layout_item_info(sp::Orientation::Horizontal, None),
3906-
);
3907-
items_vec_v.push(
3908-
sub_comp.as_pin_ref().layout_item_info(sp::Orientation::Vertical, None),
3909-
);
3911+
let repeater_id = format_ident!("repeater{}", usize::from(repeater.repeater_index));
3912+
let loop_code = quote!(for i in 0.._self.#repeater_id.len() {
3913+
if let Some(sub_comp) = _self.#repeater_id.instance_at(i) {
3914+
items_vec_h.push(
3915+
sub_comp.as_pin_ref().layout_item_info(sp::Orientation::Horizontal, None),
3916+
);
3917+
items_vec_v.push(
3918+
sub_comp.as_pin_ref().layout_item_info(sp::Orientation::Vertical, None),
3919+
);
3920+
}
39103921
});
39113922
push_code.push(quote!(
39123923
#common_push_code

0 commit comments

Comments
 (0)