From 808396423b4defc287de9627c9d30c2fb347d7c9 Mon Sep 17 00:00:00 2001 From: jedel1043 Date: Thu, 19 Oct 2023 22:17:54 -0600 Subject: [PATCH 1/2] Optimize `Array.prototype.shift` for dense arrays --- boa_engine/src/builtins/array/mod.rs | 19 +++++++++++++++++++ boa_engine/src/object/property_map.rs | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/boa_engine/src/builtins/array/mod.rs b/boa_engine/src/builtins/array/mod.rs index 9a2a0941307..dedc1f8aac9 100644 --- a/boa_engine/src/builtins/array/mod.rs +++ b/boa_engine/src/builtins/array/mod.rs @@ -1157,6 +1157,25 @@ impl Array { // b. Return undefined. return Ok(JsValue::undefined()); } + + // Small optimization for arrays using dense properties + if o.is_array() { + let mut o_borrow = o.borrow_mut(); + if let Some(dense) = o_borrow.properties_mut().dense_indexed_properties_mut() { + let value = if !dense.is_empty() { + let v = dense.remove(0); + v + } else { + JsValue::undefined() + }; + drop(o_borrow); + + Self::set_length(&o, len - 1, context)?; + + return Ok(value); + } + } + // 4. Let first be ? Get(O, "0"). let first = o.get(0, context)?; // 5. Let k be 1. diff --git a/boa_engine/src/object/property_map.rs b/boa_engine/src/object/property_map.rs index 8320fe1d88a..a7046fde8fd 100644 --- a/boa_engine/src/object/property_map.rs +++ b/boa_engine/src/object/property_map.rs @@ -55,7 +55,7 @@ enum IndexedProperties { /// are not data descriptors with with a value field, writable field set to `true`, configurable field set to `true`, enumerable field set to `true`. /// /// This method uses more space, since we also have to store the property descriptors, not just the value. - /// It is also slower because we need to to a hash lookup. + /// It is also slower because we need to do a hash lookup. Sparse(Box>), } @@ -150,7 +150,7 @@ impl IndexedProperties { replaced } - /// Inserts a property descriptor with the specified key. + /// Removes a property descriptor with the specified key. fn remove(&mut self, key: u32) -> bool { let vec = match self { Self::Sparse(map) => { From c168a5ce6938dcfa67fbb1aa80c9ad454b42bc77 Mon Sep 17 00:00:00 2001 From: jedel1043 Date: Fri, 20 Oct 2023 11:45:04 -0600 Subject: [PATCH 2/2] Optimize shifts for dense arrays --- boa_engine/src/builtins/array/mod.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/boa_engine/src/builtins/array/mod.rs b/boa_engine/src/builtins/array/mod.rs index dedc1f8aac9..8c3f3867071 100644 --- a/boa_engine/src/builtins/array/mod.rs +++ b/boa_engine/src/builtins/array/mod.rs @@ -1159,20 +1159,17 @@ impl Array { } // Small optimization for arrays using dense properties + // TODO: this optimization could be generalized to many other objects with + // slot-based dense property maps. if o.is_array() { let mut o_borrow = o.borrow_mut(); if let Some(dense) = o_borrow.properties_mut().dense_indexed_properties_mut() { - let value = if !dense.is_empty() { + if len <= dense.len() as u64 { let v = dense.remove(0); - v - } else { - JsValue::undefined() - }; - drop(o_borrow); - - Self::set_length(&o, len - 1, context)?; - - return Ok(value); + drop(o_borrow); + Self::set_length(&o, len - 1, context)?; + return Ok(v); + } } }