Index: runtime/vm/scavenger.h |
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h |
index 954919ef9be2a5085c994595d4ef35da0528097c..1180f3471027d5b912c49018088acb646ef05f82 100644 |
--- a/runtime/vm/scavenger.h |
+++ b/runtime/vm/scavenger.h |
@@ -98,6 +98,8 @@ class ScavengeStats { |
int64_t DurationMicros() const { return end_micros_ - start_micros_; } |
+ intptr_t UsedBefore() const { return before_.used_in_words * kWordSize; } |
+ |
private: |
int64_t start_micros_; |
int64_t end_micros_; |
@@ -214,6 +216,29 @@ class Scavenger { |
return usage; |
} |
+ intptr_t ScavengeRateInBytesPerMicro() const { |
+ intptr_t total_used = 0; |
+ intptr_t total_micros = 0; |
+ for (intptr_t i = 0; i < stats_history_.Size(); i++) { |
+ total_used += stats_history_.Get(i).UsedBefore(); |
+ total_micros += stats_history_.Get(i).DurationMicros(); |
+ } |
+ intptr_t scavenge_rate; |
+ if (total_micros != 0) { |
+ scavenge_rate = total_used / total_micros; |
+ } else { |
+ scavenge_rate = 400; // Conservative initial guess. |
+ } |
+ if (scavenge_rate == 0) { |
+ scavenge_rate = 1; |
+ } |
+ return scavenge_rate; |
+ } |
+ |
+ intptr_t EstimatedScavengeTime() const { |
+ return UsedInWords() * kWordSize / ScavengeRateInBytesPerMicro(); |
+ } |
+ |
void VisitObjects(ObjectVisitor* visitor) const; |
void VisitObjectPointers(ObjectPointerVisitor* visitor) const; |
@@ -330,7 +355,7 @@ class Scavenger { |
int64_t gc_time_micros_; |
intptr_t collections_; |
- static const int kStatsHistoryCapacity = 2; |
+ static const int kStatsHistoryCapacity = 8; |
RingBuffer<ScavengeStats, kStatsHistoryCapacity> stats_history_; |
// The total size of external data associated with objects in this scavenger. |