已合并
fix: skip delete throttle when length exceeds 20000 #15103
fix: skip delete throttle when length exceeds 20000 #15103
已合并
ZhangZiheng创建于 28 天前
3 个文件变更+14-0
@@ -345,6 +345,9 @@ bool JSObject::ShouldNormalizeElementsOnDeletion(JSThread *thread, JSHandle<JSOb
345 }345 }
346 346 
347 uint32_t length = obj->IsJSArray() ? JSArray::Cast(*obj)->GetArrayLength() : capacity;347 uint32_t length = obj->IsJSArray() ? JSArray::Cast(*obj)->GetArrayLength() : capacity;
348+ if (length > LARGE_ARRAY_DELETE_EAGER_LENGTH) {
349+ return true;
350+ }
348 constexpr uint32_t kLengthFraction = 16;351 constexpr uint32_t kLengthFraction = 16;
349 // capacity may be >= 64 while JSArray length < 16, making length/16 zero; keep at least one352 // capacity may be >= 64 while JSArray length < 16, making length/16 zero; keep at least one
350 // throttle step so we do not O(n)-scan on every delete in that window.353 // throttle step so we do not O(n)-scan on every delete in that window.
@@ -416,6 +416,7 @@ public:
416 static constexpr int FAST_ELEMENTS_FACTOR = 3;416 static constexpr int FAST_ELEMENTS_FACTOR = 3;
417 static constexpr int MIN_GAP = 256;417 static constexpr int MIN_GAP = 256;
418 static constexpr int MAX_GAP = 1_KB;418 static constexpr int MAX_GAP = 1_KB;
419+ static constexpr uint32_t LARGE_ARRAY_DELETE_EAGER_LENGTH = 20000;
419 static constexpr uint32_t MAX_ELEMENT_INDEX = std::numeric_limits<uint32_t>::max();420 static constexpr uint32_t MAX_ELEMENT_INDEX = std::numeric_limits<uint32_t>::max();
420 static constexpr int MIN_ELEMENTS_HINT_LENGTH = 1_KB;421 static constexpr int MIN_ELEMENTS_HINT_LENGTH = 1_KB;
421 static constexpr int MAX_ELEMENTS_HINT_LENGTH = 2_MB;422 static constexpr int MAX_ELEMENTS_HINT_LENGTH = 2_MB;
@@ -626,6 +626,16 @@ HWTEST_F_L0(ObjectOperatorTest, ShouldNormalize_NonArrayWithLiveTail)
626 EXPECT_EQ(JSObject::GetProperty(thread, sparseObject, survivingKey).GetValue()->GetInt(),626 EXPECT_EQ(JSObject::GetProperty(thread, sparseObject, survivingKey).GetValue()->GetInt(),
627 static_cast<int32_t>(length - 1));627 static_cast<int32_t>(length - 1));
628}628}
629+ 
630+HWTEST_F_L0(ObjectOperatorTest, ShouldNormalize_EagerConvertAboveLengthGate)
631+{
632+ JSHandle<JSArray> array = CreateArrayWithElements(thread, 64);
633+ JSHandle<JSObject> object(array);
634+ array->SetArrayLength(thread, JSObject::LARGE_ARRAY_DELETE_EAGER_LENGTH + 1);
635+ thread->ResetElementsDeletionCounter();
636+ EXPECT_TRUE(JSObject::ShouldNormalizeElementsOnDeletion(thread, object, 0));
637+ EXPECT_EQ(thread->GetElementsDeletionCounter(), 0U);
638+}
629#endif639#endif
630 640 
631HWTEST_F_L0(ObjectOperatorTest, ShouldNormalize_NonArrayTrailingHoles_Trim)641HWTEST_F_L0(ObjectOperatorTest, ShouldNormalize_NonArrayTrailingHoles_Trim)