| Index: test/unittests/heap/gc-tracer-unittest.cc
|
| diff --git a/test/unittests/heap/gc-tracer-unittest.cc b/test/unittests/heap/gc-tracer-unittest.cc
|
| index 2bf4d037d3ba4eaaee8975458e3d7224c54ec992..97975d488bbfe5bb8720b080d1dc57289656630a 100644
|
| --- a/test/unittests/heap/gc-tracer-unittest.cc
|
| +++ b/test/unittests/heap/gc-tracer-unittest.cc
|
| @@ -5,12 +5,17 @@
|
| #include <cmath>
|
| #include <limits>
|
|
|
| +#include "src/globals.h"
|
| #include "src/heap/gc-tracer.h"
|
| +#include "src/isolate.h"
|
| +#include "test/unittests/test-utils.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
|
|
| +typedef TestWithContext GCTracerTest;
|
| +
|
| TEST(GCTracer, AverageSpeed) {
|
| RingBuffer<BytesAndDuration> buffer;
|
| EXPECT_EQ(100 / 2,
|
| @@ -45,5 +50,138 @@ TEST(GCTracer, AverageSpeed) {
|
| GCTracer::AverageSpeed(buffer, MakeBytesAndDuration(0, 0), buffer.kSize));
|
| }
|
|
|
| +namespace {
|
| +
|
| +void SampleAndAddAllocaton(v8::internal::GCTracer* tracer, double time_ms,
|
| + size_t new_space_counter_bytes,
|
| + size_t old_generation_counter_bytes) {
|
| + tracer->SampleAllocation(time_ms, new_space_counter_bytes,
|
| + old_generation_counter_bytes);
|
| + tracer->AddAllocation(time_ms);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +TEST_F(GCTracerTest, AllocationThroughput) {
|
| + GCTracer* tracer = i_isolate()->heap()->tracer();
|
| + tracer->ResetForTesting();
|
| +
|
| + int time1 = 100;
|
| + size_t counter1 = 1000;
|
| + // First sample creates baseline but is not part of the recorded samples.
|
| + tracer->SampleAllocation(time1, counter1, counter1);
|
| + SampleAndAddAllocaton(tracer, time1, counter1, counter1);
|
| + int time2 = 200;
|
| + size_t counter2 = 2000;
|
| + SampleAndAddAllocaton(tracer, time2, counter2, counter2);
|
| + // Will only consider the current sample.
|
| + size_t throughput = static_cast<size_t>(
|
| + tracer->AllocationThroughputInBytesPerMillisecond(100));
|
| + EXPECT_EQ(2 * (counter2 - counter1) / (time2 - time1), throughput);
|
| + int time3 = 1000;
|
| + size_t counter3 = 30000;
|
| + SampleAndAddAllocaton(tracer, time3, counter3, counter3);
|
| + // Considers last 2 samples.
|
| + throughput = tracer->AllocationThroughputInBytesPerMillisecond(801);
|
| + EXPECT_EQ(2 * (counter3 - counter1) / (time3 - time1), throughput);
|
| +}
|
| +
|
| +TEST_F(GCTracerTest, NewSpaceAllocationThroughput) {
|
| + GCTracer* tracer = i_isolate()->heap()->tracer();
|
| + tracer->ResetForTesting();
|
| +
|
| + int time1 = 100;
|
| + size_t counter1 = 1000;
|
| + SampleAndAddAllocaton(tracer, time1, counter1, 0);
|
| + int time2 = 200;
|
| + size_t counter2 = 2000;
|
| + SampleAndAddAllocaton(tracer, time2, counter2, 0);
|
| + size_t throughput =
|
| + tracer->NewSpaceAllocationThroughputInBytesPerMillisecond();
|
| + EXPECT_EQ((counter2 - counter1) / (time2 - time1), throughput);
|
| + int time3 = 1000;
|
| + size_t counter3 = 30000;
|
| + SampleAndAddAllocaton(tracer, time3, counter3, 0);
|
| + throughput = tracer->NewSpaceAllocationThroughputInBytesPerMillisecond();
|
| + EXPECT_EQ((counter3 - counter1) / (time3 - time1), throughput);
|
| +}
|
| +
|
| +TEST_F(GCTracerTest, NewSpaceAllocationThroughputWithProvidedTime) {
|
| + GCTracer* tracer = i_isolate()->heap()->tracer();
|
| + tracer->ResetForTesting();
|
| +
|
| + int time1 = 100;
|
| + size_t counter1 = 1000;
|
| + // First sample creates baseline but is not part of the recorded samples.
|
| + SampleAndAddAllocaton(tracer, time1, counter1, 0);
|
| + int time2 = 200;
|
| + size_t counter2 = 2000;
|
| + SampleAndAddAllocaton(tracer, time2, counter2, 0);
|
| + // Will only consider the current sample.
|
| + size_t throughput =
|
| + tracer->NewSpaceAllocationThroughputInBytesPerMillisecond(100);
|
| + EXPECT_EQ((counter2 - counter1) / (time2 - time1), throughput);
|
| + int time3 = 1000;
|
| + size_t counter3 = 30000;
|
| + SampleAndAddAllocaton(tracer, time3, counter3, 0);
|
| + // Considers last 2 samples.
|
| + throughput = tracer->NewSpaceAllocationThroughputInBytesPerMillisecond(801);
|
| + EXPECT_EQ((counter3 - counter1) / (time3 - time1), throughput);
|
| +}
|
| +
|
| +TEST_F(GCTracerTest, OldGenerationAllocationThroughputWithProvidedTime) {
|
| + GCTracer* tracer = i_isolate()->heap()->tracer();
|
| + tracer->ResetForTesting();
|
| +
|
| + int time1 = 100;
|
| + size_t counter1 = 1000;
|
| + // First sample creates baseline but is not part of the recorded samples.
|
| + SampleAndAddAllocaton(tracer, time1, 0, counter1);
|
| + int time2 = 200;
|
| + size_t counter2 = 2000;
|
| + SampleAndAddAllocaton(tracer, time2, 0, counter2);
|
| + // Will only consider the current sample.
|
| + size_t throughput = static_cast<size_t>(
|
| + tracer->OldGenerationAllocationThroughputInBytesPerMillisecond(100));
|
| + EXPECT_EQ((counter2 - counter1) / (time2 - time1), throughput);
|
| + int time3 = 1000;
|
| + size_t counter3 = 30000;
|
| + SampleAndAddAllocaton(tracer, time3, 0, counter3);
|
| + // Considers last 2 samples.
|
| + throughput = static_cast<size_t>(
|
| + tracer->OldGenerationAllocationThroughputInBytesPerMillisecond(801));
|
| + EXPECT_EQ((counter3 - counter1) / (time3 - time1), throughput);
|
| +}
|
| +
|
| +TEST_F(GCTracerTest, RegularScope) {
|
| + GCTracer* tracer = i_isolate()->heap()->tracer();
|
| + tracer->ResetForTesting();
|
| +
|
| + EXPECT_DOUBLE_EQ(0.0, tracer->current_.scopes[GCTracer::Scope::MC_MARK]);
|
| + // Sample not added because it's not within a started tracer.
|
| + tracer->AddScopeSample(GCTracer::Scope::MC_MARK, 100);
|
| + tracer->Start(MARK_COMPACTOR, "gc unittest", "collector unittest");
|
| + tracer->AddScopeSample(GCTracer::Scope::MC_MARK, 100);
|
| + tracer->Stop(MARK_COMPACTOR);
|
| + EXPECT_DOUBLE_EQ(100.0, tracer->current_.scopes[GCTracer::Scope::MC_MARK]);
|
| +}
|
| +
|
| +TEST_F(GCTracerTest, IncrementalScope) {
|
| + GCTracer* tracer = i_isolate()->heap()->tracer();
|
| + tracer->ResetForTesting();
|
| +
|
| + EXPECT_DOUBLE_EQ(
|
| + 0.0, tracer->current_.scopes[GCTracer::Scope::MC_INCREMENTAL_FINALIZE]);
|
| + // Sample is added because its ScopeId is listed as incremental sample.
|
| + tracer->AddScopeSample(GCTracer::Scope::MC_INCREMENTAL_FINALIZE, 100);
|
| + tracer->Start(MARK_COMPACTOR, "gc unittest", "collector unittest");
|
| + // Switch to incremental MC to enable writing back incremental scopes.
|
| + tracer->current_.type = GCTracer::Event::INCREMENTAL_MARK_COMPACTOR;
|
| + tracer->AddScopeSample(GCTracer::Scope::MC_INCREMENTAL_FINALIZE, 100);
|
| + tracer->Stop(MARK_COMPACTOR);
|
| + EXPECT_DOUBLE_EQ(
|
| + 200.0, tracer->current_.scopes[GCTracer::Scope::MC_INCREMENTAL_FINALIZE]);
|
| +}
|
| +
|
| } // namespace internal
|
| } // namespace v8
|
|
|