Index: Source/platform/heap/Heap.cpp |
diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp |
index 6290a6d9ba803928b7d8350fb51f1a3d58a8c7d2..dd15f11b9873544ebf1648d09002225c5656789d 100644 |
--- a/Source/platform/heap/Heap.cpp |
+++ b/Source/platform/heap/Heap.cpp |
@@ -548,6 +548,13 @@ ThreadHeap::ThreadHeap(ThreadState* state, int index) |
, m_threadState(state) |
, m_index(index) |
, m_promptlyFreedSize(0) |
+#if ENABLE(GC_PROFILING) |
+ , m_totalAllocationSize(0.0) |
haraken
2015/02/04 07:30:00
Where is this used?
|
+ , m_allocationCount(0) |
haraken
2015/02/04 07:30:00
Ditto.
|
+ , m_inlineAllocationCount(0) |
haraken
2015/02/04 07:30:00
Ditto.
|
+ , m_allocationPointSizeSum(0) |
+ , m_setAllocationPointCount(0) |
+#endif |
{ |
clearFreeLists(); |
} |
@@ -604,6 +611,10 @@ void ThreadHeap::setAllocationPoint(Address point, size_t size) |
ASSERT(size <= static_cast<HeapPage*>(page)->payloadSize()); |
} |
#endif |
+#if ENABLE(GC_PROFILING) |
+ m_allocationPointSizeSum += size; |
+ ++m_setAllocationPointCount; |
+#endif |
if (hasCurrentAllocationArea()) |
addToFreeList(currentAllocationPoint(), remainingAllocationSize()); |
updateRemainingAllocationSize(); |
@@ -616,6 +627,10 @@ Address ThreadHeap::outOfLineAllocate(size_t allocationSize, size_t gcInfoIndex) |
ASSERT(allocationSize > remainingAllocationSize()); |
ASSERT(allocationSize >= allocationGranularity); |
+#if ENABLE(GC_PROFILING) |
+ m_threadState->snapshotFreeListIfNecessary(); |
+#endif |
+ |
// 1. If this allocation is big enough, allocate a large object. |
if (allocationSize >= largeObjectSizeThreshold) |
return allocateLargeObject(allocationSize, gcInfoIndex); |
@@ -1493,6 +1508,43 @@ void ThreadHeap::clearFreeLists() |
m_freeList.clear(); |
} |
+#if ENABLE(GC_PROFILING) |
+void ThreadHeap::snapshotFreeList(TracedValue& json) |
+{ |
+ json.setDouble("totalAllocationSize", m_totalAllocationSize); |
keishi
2015/02/04 06:58:26
nit: I think this could be renamed to cummulativeA
Yuta Kitamura
2015/02/04 09:45:42
Fixed. Can you fix your dashboard code, too?
keishi
2015/02/04 11:05:39
Done.
|
+ json.setDouble("inlineAllocationRate", static_cast<double>(m_inlineAllocationCount) / m_allocationCount); |
+ json.setInteger("inlineAllocationCount", m_inlineAllocationCount); |
+ json.setInteger("allocationCount", m_allocationCount); |
+ if (m_setAllocationPointCount > 0) |
+ json.setDouble("averageAllocationPointSize", static_cast<double>(m_allocationPointSizeSum) / m_setAllocationPointCount); |
keishi
2015/02/04 06:58:26
averageAllocationPointSize hasn't been a useful me
haraken
2015/02/04 07:30:00
Agreed. Also I'm not sure how helpful m_setAllocat
Yuta Kitamura
2015/02/04 09:45:42
Done, m_allocationPointSizeSum and m_setAllocation
|
+ m_allocationPointSizeSum = 0; |
+ m_setAllocationPointCount = 0; |
+ size_t pageCount = 0; |
+ size_t totalPageSize = 0; |
+ for (HeapPage* page = m_firstPage; page; page = page->next()) { |
+ ++pageCount; |
+ totalPageSize += page->payloadSize(); |
+ } |
+ json.setInteger("pageCount", pageCount); |
+ json.setInteger("totalPageSize", totalPageSize); |
+ size_t bucketSizes[blinkPageSizeLog2]; |
+ size_t bucketTotalSizes[blinkPageSizeLog2]; |
keishi
2015/02/04 06:58:26
I'm sorry. bucketSizes and bucketTotalSizes were h
Yuta Kitamura
2015/02/04 09:45:42
Fixed, can you take another look at this version?
keishi
2015/02/04 11:05:39
Thanks, this is much better. Done.
|
+ size_t freeSize; |
+ m_freeList.countBucketSizes(bucketSizes, bucketTotalSizes, freeSize); |
+ json.setInteger("freeSize", freeSize); |
+ |
+ json.beginArray("bucketSizes"); |
+ for (size_t i = 0; i < blinkPageSizeLog2; ++i) |
+ json.pushInteger(bucketSizes[i]); |
+ json.endArray(); |
+ |
+ json.beginArray("bucketTotalSizes"); |
+ for (size_t i = 0; i < blinkPageSizeLog2; ++i) |
+ json.pushInteger(bucketTotalSizes[i]); |
+ json.endArray(); |
+} |
+#endif |
+ |
void FreeList::clear() |
{ |
m_biggestFreeListIndex = 0; |
@@ -1511,6 +1563,22 @@ int FreeList::bucketIndexForSize(size_t size) |
return index; |
} |
+#if ENABLE(GC_PROFILING) |
+void FreeList::countBucketSizes(size_t sizes[], size_t totalSizes[], size_t& freeSize) const |
+{ |
+ freeSize = 0; |
+ for (size_t i = 0; i < blinkPageSizeLog2; i++) { |
+ sizes[i] = 0; |
+ totalSizes[i] = 0; |
+ for (FreeListEntry* entry = m_freeLists[i]; entry; entry = entry->next()) { |
+ ++sizes[i]; |
+ freeSize += entry->size(); |
+ totalSizes[i] += entry->size(); |
+ } |
+ } |
+} |
+#endif |
+ |
HeapPage::HeapPage(PageMemory* storage, ThreadHeap* heap) |
: BaseHeapPage(storage, heap) |
, m_next(nullptr) |