已合并
fix: skip delete throttle when length exceeds 20000 #15103
ZhangZiheng创建于 28 天前
fix: skip delete throttle when length exceeds 20000 #15103
已合并
共 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 one | 352 | // 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 | 639 | ||
| 630 | 640 | ||
| 631 | HWTEST_F_L0(ObjectOperatorTest, ShouldNormalize_NonArrayTrailingHoles_Trim) | 641 | HWTEST_F_L0(ObjectOperatorTest, ShouldNormalize_NonArrayTrailingHoles_Trim) |