| // Copyright 2014 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <limits> |
| |
| #include "src/common/globals.h" |
| #include "src/heap/scavenge-job.h" |
| #include "src/utils/utils.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| const size_t kScavengeSpeedInBytesPerMs = 500 * KB; |
| const size_t kNewSpaceCapacity = 8 * MB; |
| |
| |
| TEST(ScavengeJob, AllocationLimitEmptyNewSpace) { |
| EXPECT_FALSE(ScavengeJob::ReachedIdleAllocationLimit( |
| kScavengeSpeedInBytesPerMs, 0, kNewSpaceCapacity)); |
| } |
| |
| |
| TEST(ScavengeJob, AllocationLimitFullNewSpace) { |
| EXPECT_TRUE(ScavengeJob::ReachedIdleAllocationLimit( |
| kScavengeSpeedInBytesPerMs, kNewSpaceCapacity, kNewSpaceCapacity)); |
| } |
| |
| |
| TEST(ScavengeJob, AllocationLimitUnknownScavengeSpeed) { |
| size_t expected_size = ScavengeJob::kInitialScavengeSpeedInBytesPerMs * |
| ScavengeJob::kAverageIdleTimeMs - |
| ScavengeJob::kBytesAllocatedBeforeNextIdleTask; |
| expected_size = Max(expected_size, ScavengeJob::kMinAllocationLimit); |
| |
| EXPECT_FALSE(ScavengeJob::ReachedIdleAllocationLimit(0, expected_size - 1, |
| kNewSpaceCapacity)); |
| EXPECT_TRUE(ScavengeJob::ReachedIdleAllocationLimit(0, expected_size, |
| kNewSpaceCapacity)); |
| } |
| |
| |
| TEST(ScavengeJob, AllocationLimitLowScavengeSpeed) { |
| size_t scavenge_speed = 1 * KB; |
| EXPECT_FALSE(ScavengeJob::ReachedIdleAllocationLimit( |
| scavenge_speed, ScavengeJob::kMinAllocationLimit - 1, kNewSpaceCapacity)); |
| EXPECT_TRUE(ScavengeJob::ReachedIdleAllocationLimit( |
| scavenge_speed, ScavengeJob::kMinAllocationLimit, kNewSpaceCapacity)); |
| } |
| |
| |
| TEST(ScavengeJob, AllocationLimitAverageScavengeSpeed) { |
| size_t expected_size = |
| kScavengeSpeedInBytesPerMs * ScavengeJob::kAverageIdleTimeMs - |
| ScavengeJob::kBytesAllocatedBeforeNextIdleTask; |
| EXPECT_FALSE(ScavengeJob::ReachedIdleAllocationLimit( |
| kScavengeSpeedInBytesPerMs, ScavengeJob::kMinAllocationLimit, |
| kNewSpaceCapacity)); |
| EXPECT_FALSE(ScavengeJob::ReachedIdleAllocationLimit( |
| kScavengeSpeedInBytesPerMs, expected_size - 1, kNewSpaceCapacity)); |
| EXPECT_TRUE(ScavengeJob::ReachedIdleAllocationLimit( |
| kScavengeSpeedInBytesPerMs, expected_size, kNewSpaceCapacity)); |
| } |
| |
| |
| TEST(ScavengeJob, AllocationLimitHighScavengeSpeed) { |
| size_t scavenge_speed = kNewSpaceCapacity; |
| size_t expected_size = |
| static_cast<size_t>( |
| kNewSpaceCapacity * |
| ScavengeJob::kMaxAllocationLimitAsFractionOfNewSpace) - |
| ScavengeJob::kBytesAllocatedBeforeNextIdleTask; |
| EXPECT_FALSE(ScavengeJob::ReachedIdleAllocationLimit( |
| scavenge_speed, expected_size - 1, kNewSpaceCapacity)); |
| EXPECT_TRUE(ScavengeJob::ReachedIdleAllocationLimit( |
| scavenge_speed, expected_size + 1, kNewSpaceCapacity)); |
| } |
| |
| |
| TEST(ScavengeJob, EnoughIdleTimeForScavengeUnknownScavengeSpeed) { |
| size_t scavenge_speed = ScavengeJob::kInitialScavengeSpeedInBytesPerMs; |
| size_t new_space_size = 1 * MB; |
| size_t expected_time = (new_space_size + scavenge_speed - 1) / scavenge_speed; |
| EXPECT_TRUE( |
| ScavengeJob::EnoughIdleTimeForScavenge(expected_time, 0, new_space_size)); |
| EXPECT_FALSE(ScavengeJob::EnoughIdleTimeForScavenge(expected_time - 1, 0, |
| new_space_size)); |
| } |
| |
| |
| TEST(ScavengeJob, EnoughIdleTimeForScavengeLowScavengeSpeed) { |
| size_t scavenge_speed = 1 * KB; |
| size_t new_space_size = 1 * MB; |
| size_t expected_time = (new_space_size + scavenge_speed - 1) / scavenge_speed; |
| EXPECT_TRUE(ScavengeJob::EnoughIdleTimeForScavenge( |
| expected_time, scavenge_speed, new_space_size)); |
| EXPECT_FALSE(ScavengeJob::EnoughIdleTimeForScavenge( |
| expected_time - 1, scavenge_speed, new_space_size)); |
| } |
| |
| |
| TEST(ScavengeJob, EnoughIdleTimeForScavengeHighScavengeSpeed) { |
| size_t scavenge_speed = kNewSpaceCapacity; |
| size_t new_space_size = 1 * MB; |
| size_t expected_time = (new_space_size + scavenge_speed - 1) / scavenge_speed; |
| EXPECT_TRUE(ScavengeJob::EnoughIdleTimeForScavenge( |
| expected_time, scavenge_speed, new_space_size)); |
| EXPECT_FALSE(ScavengeJob::EnoughIdleTimeForScavenge( |
| expected_time - 1, scavenge_speed, new_space_size)); |
| } |
| |
| } // namespace internal |
| } // namespace v8 |