Index: src/heap/gc-tracer.h |
diff --git a/src/heap/gc-tracer.h b/src/heap/gc-tracer.h |
index ed07750a4a91464701692e20943521b378417388..531bba3cea78090e3cc47c5c48e54f3d0547655a 100644 |
--- a/src/heap/gc-tracer.h |
+++ b/src/heap/gc-tracer.h |
@@ -9,6 +9,7 @@ |
#include "src/base/platform/platform.h" |
#include "src/counters.h" |
#include "src/globals.h" |
+#include "testing/gtest/include/gtest/gtest_prod.h" |
namespace v8 { |
namespace internal { |
@@ -59,54 +60,64 @@ inline BytesAndDuration MakeBytesAndDuration(uint64_t bytes, double duration) { |
enum ScavengeSpeedMode { kForAllObjects, kForSurvivedObjects }; |
-#define TRACER_SCOPES(F) \ |
- F(EXTERNAL_WEAK_GLOBAL_HANDLES) \ |
- F(MC_CLEAR) \ |
- F(MC_CLEAR_CODE_FLUSH) \ |
- F(MC_CLEAR_DEPENDENT_CODE) \ |
- F(MC_CLEAR_GLOBAL_HANDLES) \ |
- F(MC_CLEAR_MAPS) \ |
- F(MC_CLEAR_SLOTS_BUFFER) \ |
- F(MC_CLEAR_STORE_BUFFER) \ |
- F(MC_CLEAR_STRING_TABLE) \ |
- F(MC_CLEAR_WEAK_CELLS) \ |
- F(MC_CLEAR_WEAK_COLLECTIONS) \ |
- F(MC_CLEAR_WEAK_LISTS) \ |
- F(MC_EVACUATE) \ |
- F(MC_EVACUATE_CANDIDATES) \ |
- F(MC_EVACUATE_CLEAN_UP) \ |
- F(MC_EVACUATE_COPY) \ |
- F(MC_EVACUATE_UPDATE_POINTERS) \ |
- F(MC_EVACUATE_UPDATE_POINTERS_TO_EVACUATED) \ |
- F(MC_EVACUATE_UPDATE_POINTERS_TO_NEW) \ |
- F(MC_EVACUATE_UPDATE_POINTERS_WEAK) \ |
- F(MC_EXTERNAL_EPILOGUE) \ |
- F(MC_EXTERNAL_PROLOGUE) \ |
- F(MC_FINISH) \ |
- F(MC_INCREMENTAL_FINALIZE) \ |
- F(MC_INCREMENTAL_EXTERNAL_EPILOGUE) \ |
- F(MC_INCREMENTAL_EXTERNAL_PROLOGUE) \ |
- F(MC_MARK) \ |
- F(MC_MARK_FINISH_INCREMENTAL) \ |
- F(MC_MARK_PREPARE_CODE_FLUSH) \ |
- F(MC_MARK_ROOTS) \ |
- F(MC_MARK_WEAK_CLOSURE) \ |
- F(MC_MARK_WEAK_CLOSURE_EPHEMERAL) \ |
- F(MC_MARK_WEAK_CLOSURE_WEAK_HANDLES) \ |
- F(MC_MARK_WEAK_CLOSURE_WEAK_ROOTS) \ |
- F(MC_MARK_WEAK_CLOSURE_HARMONY) \ |
- F(MC_SWEEP) \ |
- F(MC_SWEEP_CODE) \ |
- F(MC_SWEEP_MAP) \ |
- F(MC_SWEEP_OLD) \ |
- F(SCAVENGER_CODE_FLUSH_CANDIDATES) \ |
- F(SCAVENGER_EXTERNAL_EPILOGUE) \ |
- F(SCAVENGER_EXTERNAL_PROLOGUE) \ |
- F(SCAVENGER_OBJECT_GROUPS) \ |
- F(SCAVENGER_OLD_TO_NEW_POINTERS) \ |
- F(SCAVENGER_ROOTS) \ |
- F(SCAVENGER_SCAVENGE) \ |
- F(SCAVENGER_SEMISPACE) \ |
+#define INCREMENTAL_SCOPES(F) \ |
+ F(MC_INCREMENTAL_WRAPPER_PROLOGUE) \ |
+ F(MC_INCREMENTAL_WRAPPER_TRACING) \ |
+ F(MC_INCREMENTAL_FINALIZE) \ |
+ F(MC_INCREMENTAL_FINALIZE_OBJECT_GROUPING) \ |
+ F(MC_INCREMENTAL_EXTERNAL_EPILOGUE) \ |
+ F(MC_INCREMENTAL_EXTERNAL_PROLOGUE) |
+ |
+#define TRACER_SCOPES(F) \ |
+ INCREMENTAL_SCOPES(F) \ |
+ F(EXTERNAL_WEAK_GLOBAL_HANDLES) \ |
+ F(MC_CLEAR) \ |
+ F(MC_CLEAR_CODE_FLUSH) \ |
+ F(MC_CLEAR_DEPENDENT_CODE) \ |
+ F(MC_CLEAR_GLOBAL_HANDLES) \ |
+ F(MC_CLEAR_MAPS) \ |
+ F(MC_CLEAR_SLOTS_BUFFER) \ |
+ F(MC_CLEAR_STORE_BUFFER) \ |
+ F(MC_CLEAR_STRING_TABLE) \ |
+ F(MC_CLEAR_WEAK_CELLS) \ |
+ F(MC_CLEAR_WEAK_COLLECTIONS) \ |
+ F(MC_CLEAR_WEAK_LISTS) \ |
+ F(MC_EVACUATE) \ |
+ F(MC_EVACUATE_CANDIDATES) \ |
+ F(MC_EVACUATE_CLEAN_UP) \ |
+ F(MC_EVACUATE_COPY) \ |
+ F(MC_EVACUATE_UPDATE_POINTERS) \ |
+ F(MC_EVACUATE_UPDATE_POINTERS_TO_EVACUATED) \ |
+ F(MC_EVACUATE_UPDATE_POINTERS_TO_NEW) \ |
+ F(MC_EVACUATE_UPDATE_POINTERS_WEAK) \ |
+ F(MC_EXTERNAL_EPILOGUE) \ |
+ F(MC_EXTERNAL_PROLOGUE) \ |
+ F(MC_FINISH) \ |
+ F(MC_MARK) \ |
+ F(MC_MARK_FINISH_INCREMENTAL) \ |
+ F(MC_MARK_PREPARE_CODE_FLUSH) \ |
+ F(MC_MARK_ROOTS) \ |
+ F(MC_MARK_WEAK_CLOSURE) \ |
+ F(MC_MARK_WEAK_CLOSURE_EPHEMERAL) \ |
+ F(MC_MARK_WEAK_CLOSURE_WEAK_HANDLES) \ |
+ F(MC_MARK_WEAK_CLOSURE_WEAK_ROOTS) \ |
+ F(MC_MARK_WEAK_CLOSURE_HARMONY) \ |
+ F(MC_MARK_WRAPPER_EPILOGUE) \ |
+ F(MC_MARK_WRAPPER_PROLOGUE) \ |
+ F(MC_MARK_WRAPPER_TRACING) \ |
+ F(MC_MARK_OBJECT_GROUPING) \ |
+ F(MC_SWEEP) \ |
+ F(MC_SWEEP_CODE) \ |
+ F(MC_SWEEP_MAP) \ |
+ F(MC_SWEEP_OLD) \ |
+ F(SCAVENGER_CODE_FLUSH_CANDIDATES) \ |
+ F(SCAVENGER_EXTERNAL_EPILOGUE) \ |
+ F(SCAVENGER_EXTERNAL_PROLOGUE) \ |
+ F(SCAVENGER_OBJECT_GROUPS) \ |
+ F(SCAVENGER_OLD_TO_NEW_POINTERS) \ |
+ F(SCAVENGER_ROOTS) \ |
+ F(SCAVENGER_SCAVENGE) \ |
+ F(SCAVENGER_SEMISPACE) \ |
F(SCAVENGER_WEAK) |
#define TRACE_GC(tracer, scope_id) \ |
@@ -126,7 +137,12 @@ class GCTracer { |
#define DEFINE_SCOPE(scope) scope, |
TRACER_SCOPES(DEFINE_SCOPE) |
#undef DEFINE_SCOPE |
- NUMBER_OF_SCOPES |
+ NUMBER_OF_SCOPES, |
+ |
+ FIRST_INCREMENTAL_SCOPE = MC_INCREMENTAL_WRAPPER_PROLOGUE, |
+ LAST_INCREMENTAL_SCOPE = MC_INCREMENTAL_EXTERNAL_PROLOGUE, |
+ NUMBER_OF_INCREMENTAL_SCOPES = |
+ LAST_INCREMENTAL_SCOPE - FIRST_INCREMENTAL_SCOPE + 1 |
}; |
Scope(GCTracer* tracer, ScopeId scope); |
@@ -197,7 +213,7 @@ class GCTracer { |
// Size of new space objects in constructor. |
intptr_t new_space_object_size; |
- // Size of survived new space objects in desctructor. |
+ // Size of survived new space objects in destructor. |
intptr_t survived_new_space_object_size; |
// Number of incremental marking steps since creation of tracer. |
@@ -239,10 +255,35 @@ class GCTracer { |
// events |
double pure_incremental_marking_duration; |
- // Longest incremental marking step since start of marking. |
- // (value at start of event) |
+ // Longest incremental marking step since start of marking (start of event). |
double longest_incremental_marking_step; |
+ // Number of incremental marking finalization steps since creation of |
+ // tracer. |
+ int cumulative_incremental_marking_finalization_steps; |
+ |
+ // Cumulative pure duration of incremental marking steps since creation of |
+ // tracer. (value at start of event) |
+ double cumulative_incremental_marking_finalizaton_duration; |
+ |
+ // Longest incremental marking finalization step since start of marking |
+ // (start of event). |
+ double longest_incremental_marking_finalization_step; |
+ |
+ // Incremental marking finalization steps since |
+ // - last event for SCAVENGER events |
+ // - last INCREMENTAL_MARK_COMPACTOR event for INCREMENTAL_MARK_COMPACTOR |
+ // events |
+ int incremental_marking_finalizaton_steps; |
+ |
+ // Duration of incremental marking finalization steps since |
+ // - last event for SCAVENGER events |
+ // - last INCREMENTAL_MARK_COMPACTOR event for INCREMENTAL_MARK_COMPACTOR |
+ // events |
+ double incremental_marking_finalization_duration; |
+ |
+ double cumulative_incremental_scopes[Scope::NUMBER_OF_INCREMENTAL_SCOPES]; |
+ |
// Amounts of time spent in different scopes during GC. |
double scopes[Scope::NUMBER_OF_SCOPES]; |
}; |
@@ -365,6 +406,17 @@ class GCTracer { |
// Discard all recorded survival events. |
void ResetSurvivalEvents(); |
+ void AddScopeSample(Scope::ScopeId scope, double duration); |
+ |
+ private: |
+ FRIEND_TEST(GCTracer, AverageSpeed); |
+ FRIEND_TEST(GCTracerTest, AllocationThroughput); |
+ FRIEND_TEST(GCTracerTest, NewSpaceAllocationThroughput); |
+ FRIEND_TEST(GCTracerTest, NewSpaceAllocationThroughputWithProvidedTime); |
+ FRIEND_TEST(GCTracerTest, OldGenerationAllocationThroughputWithProvidedTime); |
+ FRIEND_TEST(GCTracerTest, RegularScope); |
+ FRIEND_TEST(GCTracerTest, IncrementalScope); |
+ |
// Returns the average speed of the events in the buffer. |
// If the buffer is empty, the result is 0. |
// Otherwise, the result is between 1 byte/ms and 1 GB/ms. |
@@ -374,7 +426,6 @@ class GCTracer { |
void ResetForTesting(); |
- private: |
// Print one detailed trace line in name=value format. |
// TODO(ernstm): Move to Heap. |
void PrintNVP() const; |
@@ -455,6 +506,10 @@ class GCTracer { |
// This timer is precise when run with --print-cumulative-gc-stat |
double cumulative_marking_duration_; |
+ // Cumulative duration of incremental marking scopes since the creation of |
+ // the tracer. |
+ double cumulative_incremental_scopes_[Scope::NUMBER_OF_INCREMENTAL_SCOPES]; |
+ |
// Total sweeping time on the main thread. |
// This timer is precise when run with --print-cumulative-gc-stat |
// TODO(hpayer): Account for sweeping time on sweeper threads. Add a |