From c56a3ce59a1b7931a46c43062f541ef18e9995d9 Mon Sep 17 00:00:00 2001 From: Hao Xu Date: Tue, 9 May 2023 15:26:06 +0800 Subject: [PATCH] vmm: reduce memory copy when BFT device tree The current implementation of breadth first traversal for device tree uses a temporary vector, therefore causes unnecessary memory copy. Remove it and do it within vector nodes. Signed-off-by: Hao Xu --- vmm/src/device_tree.rs | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/vmm/src/device_tree.rs b/vmm/src/device_tree.rs index 083e9a07a..976cc6ab6 100644 --- a/vmm/src/device_tree.rs +++ b/vmm/src/device_tree.rs @@ -109,7 +109,8 @@ pub struct BftIter<'a> { impl<'a> BftIter<'a> { fn new(hash_map: &'a HashMap) -> Self { - let mut nodes = Vec::new(); + let mut nodes = Vec::with_capacity(hash_map.len()); + let mut i = 0; for (_, node) in hash_map.iter() { if node.parent.is_none() { @@ -117,26 +118,13 @@ impl<'a> BftIter<'a> { } } - let mut node_layer = nodes.as_slice(); - loop { - let mut next_node_layer = Vec::new(); - - for node in node_layer.iter() { - for child_node_id in node.children.iter() { - if let Some(child_node) = hash_map.get(child_node_id) { - next_node_layer.push(child_node); - } + while i < nodes.len() { + for child_node_id in nodes[i].children.iter() { + if let Some(child_node) = hash_map.get(child_node_id) { + nodes.push(child_node); } } - - if next_node_layer.is_empty() { - break; - } - - let pos = nodes.len(); - nodes.extend(next_node_layer); - - node_layer = &nodes[pos..]; + i += 1; } BftIter { nodes }