| Index: src/heap/gc-tracer.cc
|
| diff --git a/src/heap/gc-tracer.cc b/src/heap/gc-tracer.cc
|
| index 035e3ee0c493c75fa1cc3f583c23ccd04da30358..85ee8aa22059447d7cf4c9f309a90ccb4d6adf00 100644
|
| --- a/src/heap/gc-tracer.cc
|
| +++ b/src/heap/gc-tracer.cc
|
| @@ -19,6 +19,13 @@ static intptr_t CountTotalHolesSize(Heap* heap) {
|
| }
|
|
|
|
|
| +GCTracer::AllocationEvent::AllocationEvent(double duration,
|
| + intptr_t allocation_in_bytes) {
|
| + duration_ = duration;
|
| + allocation_in_bytes_ = allocation_in_bytes;
|
| +}
|
| +
|
| +
|
| GCTracer::Event::Event(Type type, const char* gc_reason,
|
| const char* collector_reason)
|
| : type(type),
|
| @@ -80,7 +87,8 @@ GCTracer::GCTracer(Heap* heap)
|
| cumulative_pure_incremental_marking_duration_(0.0),
|
| longest_incremental_marking_step_(0.0),
|
| cumulative_marking_duration_(0.0),
|
| - cumulative_sweeping_duration_(0.0) {
|
| + cumulative_sweeping_duration_(0.0),
|
| + new_space_top_after_gc_(0) {
|
| current_ = Event(Event::START, NULL, NULL);
|
| current_.end_time = base::OS::TimeCurrentMillis();
|
| previous_ = previous_mark_compactor_event_ = current_;
|
| @@ -90,6 +98,13 @@ GCTracer::GCTracer(Heap* heap)
|
| void GCTracer::Start(GarbageCollector collector, const char* gc_reason,
|
| const char* collector_reason) {
|
| previous_ = current_;
|
| + double start_time = base::OS::TimeCurrentMillis();
|
| + if (new_space_top_after_gc_ != 0) {
|
| + AddNewSpaceAllocationTime(
|
| + start_time - previous_.end_time,
|
| + reinterpret_cast<intptr_t>((heap_->new_space()->top()) -
|
| + new_space_top_after_gc_));
|
| + }
|
| if (current_.type == Event::MARK_COMPACTOR)
|
| previous_mark_compactor_event_ = current_;
|
|
|
| @@ -99,7 +114,7 @@ void GCTracer::Start(GarbageCollector collector, const char* gc_reason,
|
| current_ = Event(Event::MARK_COMPACTOR, gc_reason, collector_reason);
|
| }
|
|
|
| - current_.start_time = base::OS::TimeCurrentMillis();
|
| + current_.start_time = start_time;
|
| current_.start_object_size = heap_->SizeOfObjects();
|
| current_.start_memory_size = heap_->isolate()->memory_allocator()->Size();
|
| current_.start_holes_size = CountTotalHolesSize(heap_);
|
| @@ -127,6 +142,8 @@ void GCTracer::Stop() {
|
| current_.end_object_size = heap_->SizeOfObjects();
|
| current_.end_memory_size = heap_->isolate()->memory_allocator()->Size();
|
| current_.end_holes_size = CountTotalHolesSize(heap_);
|
| + new_space_top_after_gc_ =
|
| + reinterpret_cast<intptr_t>(heap_->new_space()->top());
|
|
|
| if (current_.type == Event::SCAVENGER) {
|
| current_.incremental_marking_steps =
|
| @@ -184,6 +201,12 @@ void GCTracer::Stop() {
|
| }
|
|
|
|
|
| +void GCTracer::AddNewSpaceAllocationTime(double duration,
|
| + intptr_t allocation_in_bytes) {
|
| + allocation_events_.push_front(AllocationEvent(duration, allocation_in_bytes));
|
| +}
|
| +
|
| +
|
| void GCTracer::AddIncrementalMarkingStep(double duration, intptr_t bytes) {
|
| cumulative_incremental_marking_steps_++;
|
| cumulative_incremental_marking_bytes_ += bytes;
|
| @@ -294,6 +317,8 @@ void GCTracer::PrintNVP() const {
|
| PrintF("nodes_promoted=%d ", heap_->nodes_promoted_);
|
| PrintF("promotion_rate=%.1f%% ", heap_->promotion_rate_);
|
| PrintF("semi_space_copy_rate=%.1f%% ", heap_->semi_space_copied_rate_);
|
| + PrintF("new_space_allocation_throughput=%d ",
|
| + NewSpaceAllocationThroughputInBytesPerMillisecond());
|
|
|
| if (current_.type == Event::SCAVENGER) {
|
| PrintF("steps_count=%d ", current_.incremental_marking_steps);
|
| @@ -435,5 +460,21 @@ intptr_t GCTracer::MarkCompactSpeedInBytesPerMillisecond() const {
|
|
|
| return static_cast<intptr_t>(bytes / durations);
|
| }
|
| +
|
| +
|
| +intptr_t GCTracer::NewSpaceAllocationThroughputInBytesPerMillisecond() const {
|
| + intptr_t bytes = 0;
|
| + double durations = 0.0;
|
| + AllocationEventBuffer::const_iterator iter = allocation_events_.begin();
|
| + while (iter != allocation_events_.end()) {
|
| + bytes += iter->allocation_in_bytes_;
|
| + durations += iter->duration_;
|
| + ++iter;
|
| + }
|
| +
|
| + if (durations == 0.0) return 0;
|
| +
|
| + return static_cast<intptr_t>(bytes / durations);
|
| +}
|
| }
|
| } // namespace v8::internal
|
|
|