Index: Source/platform/heap/Heap.cpp |
diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp |
index 0b61bbfc8468f184ca4c6f9f14b96e3a754843d9..e5416afff7609fd1753ee895c34ea2c744f7e383 100644 |
--- a/Source/platform/heap/Heap.cpp |
+++ b/Source/platform/heap/Heap.cpp |
@@ -2203,6 +2203,7 @@ void Heap::init() |
s_allocatedObjectSize = 0; |
s_allocatedSpace = 0; |
s_markedObjectSize = 0; |
+ s_markingTimeInLastGC = 0.0; |
GCInfoTable::init(); |
} |
@@ -2524,8 +2525,11 @@ void Heap::collectGarbage(ThreadState::StackState stackState, ThreadState::GCTyp |
static_cast<MarkingVisitor<GlobalMarking>*>(s_markingVisitor)->reportStats(); |
#endif |
+ double markingTimeInMilliseconds = WTF::currentTimeMS() - timeStamp; |
+ s_markingTimeInLastGC = markingTimeInMilliseconds / 1000; |
+ |
if (Platform::current()) { |
- Platform::current()->histogramCustomCounts("BlinkGC.CollectGarbage", WTF::currentTimeMS() - timeStamp, 0, 10 * 1000, 50); |
+ Platform::current()->histogramCustomCounts("BlinkGC.CollectGarbage", markingTimeInMilliseconds, 0, 10 * 1000, 50); |
Platform::current()->histogramCustomCounts("BlinkGC.TotalObjectSpace", Heap::allocatedObjectSize() / 1024, 0, 4 * 1024 * 1024, 50); |
Platform::current()->histogramCustomCounts("BlinkGC.TotalAllocatedSpace", Heap::allocatedSpace() / 1024, 0, 4 * 1024 * 1024, 50); |
Platform::current()->histogramEnumeration("BlinkGC.GCReason", reason, NumberOfGCReasonForTracing); |
@@ -2636,8 +2640,22 @@ void Heap::collectAllGarbage() |
double Heap::estimatedMarkingTime() |
{ |
- // FIXME: Implement heuristics |
- return 0.0; |
+ ASSERT(ThreadState::current()->isMainThread()); |
+ |
+ // Marking algorithm takes O(N_live_objs), so the next marking time can be estimated as: |
+ // ~ N_live_objs |
+ // t_next = t_last * ------------------ |
+ // N_last_live_objs |
+ // By estimating N_{,last}_live_objs ratio using object size ratio, we get: |
+ // ~ (Size_new_objs + Size_last_marked_objs) * Rate_alive |
+ // t_next = t_last * ------------------------------------------------------ |
+ // Size_last_marked_objs |
+ |
+ double estimatedObjectCountIncreaseRatio = 1.0; |
+ if (Heap::markedObjectSize() > 0) |
+ estimatedObjectCountIncreaseRatio = (Heap::allocatedObjectSize() + Heap::markedObjectSize()) * ThreadState::current()->collectionRate() / Heap::markedObjectSize(); |
+ |
+ return s_markingTimeInLastGC * estimatedObjectCountIncreaseRatio; |
} |
size_t Heap::objectPayloadSizeForTesting() |
@@ -2899,5 +2917,6 @@ size_t Heap::s_markedObjectSize = 0; |
size_t Heap::s_externallyAllocatedBytes = 0; |
size_t Heap::s_externallyAllocatedBytesAlive = 0; |
unsigned Heap::s_requestedUrgentGC = false; |
+double Heap::s_markingTimeInLastGC = 0.0; |
} // namespace blink |