Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(619)

Side by Side Diff: src/heap/gc-tracer.cc

Issue 463453002: Measure incremental marking speed in bytes per millisecond based on pure incremental marking steps. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/heap/gc-tracer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/heap/gc-tracer.h" 7 #include "src/heap/gc-tracer.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
(...skipping 20 matching lines...) Expand all
31 start_memory_size(0), 31 start_memory_size(0),
32 end_memory_size(0), 32 end_memory_size(0),
33 start_holes_size(0), 33 start_holes_size(0),
34 end_holes_size(0), 34 end_holes_size(0),
35 cumulative_incremental_marking_steps(0), 35 cumulative_incremental_marking_steps(0),
36 incremental_marking_steps(0), 36 incremental_marking_steps(0),
37 cumulative_incremental_marking_bytes(0), 37 cumulative_incremental_marking_bytes(0),
38 incremental_marking_bytes(0), 38 incremental_marking_bytes(0),
39 cumulative_incremental_marking_duration(0.0), 39 cumulative_incremental_marking_duration(0.0),
40 incremental_marking_duration(0.0), 40 incremental_marking_duration(0.0),
41 cumulative_pure_incremental_marking_duration(0.0),
42 pure_incremental_marking_duration(0.0),
41 longest_incremental_marking_step(0.0) { 43 longest_incremental_marking_step(0.0) {
42 for (int i = 0; i < Scope::NUMBER_OF_SCOPES; i++) { 44 for (int i = 0; i < Scope::NUMBER_OF_SCOPES; i++) {
43 scopes[i] = 0; 45 scopes[i] = 0;
44 } 46 }
45 } 47 }
46 48
47 49
48 const char* GCTracer::Event::TypeName(bool short_name) const { 50 const char* GCTracer::Event::TypeName(bool short_name) const {
49 switch (type) { 51 switch (type) {
50 case SCAVENGER: 52 case SCAVENGER:
(...skipping 17 matching lines...) Expand all
68 } 70 }
69 return "Unknown Event Type"; 71 return "Unknown Event Type";
70 } 72 }
71 73
72 74
73 GCTracer::GCTracer(Heap* heap) 75 GCTracer::GCTracer(Heap* heap)
74 : heap_(heap), 76 : heap_(heap),
75 cumulative_incremental_marking_steps_(0), 77 cumulative_incremental_marking_steps_(0),
76 cumulative_incremental_marking_bytes_(0), 78 cumulative_incremental_marking_bytes_(0),
77 cumulative_incremental_marking_duration_(0.0), 79 cumulative_incremental_marking_duration_(0.0),
80 cumulative_pure_incremental_marking_duration_(0.0),
78 longest_incremental_marking_step_(0.0), 81 longest_incremental_marking_step_(0.0),
79 cumulative_marking_duration_(0.0), 82 cumulative_marking_duration_(0.0),
80 cumulative_sweeping_duration_(0.0) { 83 cumulative_sweeping_duration_(0.0) {
81 current_ = Event(Event::START, NULL, NULL); 84 current_ = Event(Event::START, NULL, NULL);
82 current_.end_time = base::OS::TimeCurrentMillis(); 85 current_.end_time = base::OS::TimeCurrentMillis();
83 previous_ = previous_mark_compactor_event_ = current_; 86 previous_ = previous_mark_compactor_event_ = current_;
84 } 87 }
85 88
86 89
87 void GCTracer::Start(GarbageCollector collector, const char* gc_reason, 90 void GCTracer::Start(GarbageCollector collector, const char* gc_reason,
(...skipping 12 matching lines...) Expand all
100 current_.start_object_size = heap_->SizeOfObjects(); 103 current_.start_object_size = heap_->SizeOfObjects();
101 current_.start_memory_size = heap_->isolate()->memory_allocator()->Size(); 104 current_.start_memory_size = heap_->isolate()->memory_allocator()->Size();
102 current_.start_holes_size = CountTotalHolesSize(heap_); 105 current_.start_holes_size = CountTotalHolesSize(heap_);
103 106
104 current_.cumulative_incremental_marking_steps = 107 current_.cumulative_incremental_marking_steps =
105 cumulative_incremental_marking_steps_; 108 cumulative_incremental_marking_steps_;
106 current_.cumulative_incremental_marking_bytes = 109 current_.cumulative_incremental_marking_bytes =
107 cumulative_incremental_marking_bytes_; 110 cumulative_incremental_marking_bytes_;
108 current_.cumulative_incremental_marking_duration = 111 current_.cumulative_incremental_marking_duration =
109 cumulative_incremental_marking_duration_; 112 cumulative_incremental_marking_duration_;
113 current_.cumulative_pure_incremental_marking_duration =
114 cumulative_pure_incremental_marking_duration_;
110 current_.longest_incremental_marking_step = longest_incremental_marking_step_; 115 current_.longest_incremental_marking_step = longest_incremental_marking_step_;
111 116
112 for (int i = 0; i < Scope::NUMBER_OF_SCOPES; i++) { 117 for (int i = 0; i < Scope::NUMBER_OF_SCOPES; i++) {
113 current_.scopes[i] = 0; 118 current_.scopes[i] = 0;
114 } 119 }
115 } 120 }
116 121
117 122
118 void GCTracer::Stop() { 123 void GCTracer::Stop() {
119 current_.end_time = base::OS::TimeCurrentMillis(); 124 current_.end_time = base::OS::TimeCurrentMillis();
120 current_.end_object_size = heap_->SizeOfObjects(); 125 current_.end_object_size = heap_->SizeOfObjects();
121 current_.end_memory_size = heap_->isolate()->memory_allocator()->Size(); 126 current_.end_memory_size = heap_->isolate()->memory_allocator()->Size();
122 current_.end_holes_size = CountTotalHolesSize(heap_); 127 current_.end_holes_size = CountTotalHolesSize(heap_);
123 128
124 if (current_.type == Event::SCAVENGER) { 129 if (current_.type == Event::SCAVENGER) {
125 current_.incremental_marking_steps = 130 current_.incremental_marking_steps =
126 current_.cumulative_incremental_marking_steps - 131 current_.cumulative_incremental_marking_steps -
127 previous_.cumulative_incremental_marking_steps; 132 previous_.cumulative_incremental_marking_steps;
128 current_.incremental_marking_bytes = 133 current_.incremental_marking_bytes =
129 current_.cumulative_incremental_marking_bytes - 134 current_.cumulative_incremental_marking_bytes -
130 previous_.cumulative_incremental_marking_bytes; 135 previous_.cumulative_incremental_marking_bytes;
131 current_.incremental_marking_duration = 136 current_.incremental_marking_duration =
132 current_.cumulative_incremental_marking_duration - 137 current_.cumulative_incremental_marking_duration -
133 previous_.cumulative_incremental_marking_duration; 138 previous_.cumulative_incremental_marking_duration;
139 current_.pure_incremental_marking_duration =
140 current_.cumulative_pure_incremental_marking_duration -
141 previous_.cumulative_pure_incremental_marking_duration;
134 scavenger_events_.push_front(current_); 142 scavenger_events_.push_front(current_);
135 } else { 143 } else {
136 current_.incremental_marking_steps = 144 current_.incremental_marking_steps =
137 current_.cumulative_incremental_marking_steps - 145 current_.cumulative_incremental_marking_steps -
138 previous_mark_compactor_event_.cumulative_incremental_marking_steps; 146 previous_mark_compactor_event_.cumulative_incremental_marking_steps;
139 current_.incremental_marking_bytes = 147 current_.incremental_marking_bytes =
140 current_.cumulative_incremental_marking_bytes - 148 current_.cumulative_incremental_marking_bytes -
141 previous_mark_compactor_event_.cumulative_incremental_marking_bytes; 149 previous_mark_compactor_event_.cumulative_incremental_marking_bytes;
142 current_.incremental_marking_duration = 150 current_.incremental_marking_duration =
143 current_.cumulative_incremental_marking_duration - 151 current_.cumulative_incremental_marking_duration -
144 previous_mark_compactor_event_.cumulative_incremental_marking_duration; 152 previous_mark_compactor_event_.cumulative_incremental_marking_duration;
153 current_.pure_incremental_marking_duration =
154 current_.cumulative_pure_incremental_marking_duration -
155 previous_mark_compactor_event_
156 .cumulative_pure_incremental_marking_duration;
145 longest_incremental_marking_step_ = 0.0; 157 longest_incremental_marking_step_ = 0.0;
146 mark_compactor_events_.push_front(current_); 158 mark_compactor_events_.push_front(current_);
147 } 159 }
148 160
149 // TODO(ernstm): move the code below out of GCTracer. 161 // TODO(ernstm): move the code below out of GCTracer.
150 162
151 if (!FLAG_trace_gc && !FLAG_print_cumulative_gc_stat) return; 163 if (!FLAG_trace_gc && !FLAG_print_cumulative_gc_stat) return;
152 164
153 double duration = current_.end_time - current_.start_time; 165 double duration = current_.end_time - current_.start_time;
154 double spent_in_mutator = Max(current_.start_time - previous_.end_time, 0.0); 166 double spent_in_mutator = Max(current_.start_time - previous_.end_time, 0.0);
(...skipping 15 matching lines...) Expand all
170 } 182 }
171 183
172 184
173 void GCTracer::AddIncrementalMarkingStep(double duration, intptr_t bytes) { 185 void GCTracer::AddIncrementalMarkingStep(double duration, intptr_t bytes) {
174 cumulative_incremental_marking_steps_++; 186 cumulative_incremental_marking_steps_++;
175 cumulative_incremental_marking_bytes_ += bytes; 187 cumulative_incremental_marking_bytes_ += bytes;
176 cumulative_incremental_marking_duration_ += duration; 188 cumulative_incremental_marking_duration_ += duration;
177 longest_incremental_marking_step_ = 189 longest_incremental_marking_step_ =
178 Max(longest_incremental_marking_step_, duration); 190 Max(longest_incremental_marking_step_, duration);
179 cumulative_marking_duration_ += duration; 191 cumulative_marking_duration_ += duration;
192 if (bytes > 0) {
193 cumulative_pure_incremental_marking_duration_ += duration;
194 }
180 } 195 }
181 196
182 197
183 void GCTracer::Print() const { 198 void GCTracer::Print() const {
184 PrintPID("%8.0f ms: ", heap_->isolate()->time_millis_since_init()); 199 PrintPID("%8.0f ms: ", heap_->isolate()->time_millis_since_init());
185 200
186 PrintF("%s %.1f (%.1f) -> %.1f (%.1f) MB, ", current_.TypeName(false), 201 PrintF("%s %.1f (%.1f) -> %.1f (%.1f) MB, ", current_.TypeName(false),
187 static_cast<double>(current_.start_object_size) / MB, 202 static_cast<double>(current_.start_object_size) / MB,
188 static_cast<double>(current_.start_memory_size) / MB, 203 static_cast<double>(current_.start_memory_size) / MB,
189 static_cast<double>(current_.end_object_size) / MB, 204 static_cast<double>(current_.end_object_size) / MB,
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 } 375 }
361 376
362 377
363 intptr_t GCTracer::IncrementalMarkingSpeedInBytesPerMillisecond() const { 378 intptr_t GCTracer::IncrementalMarkingSpeedInBytesPerMillisecond() const {
364 if (cumulative_incremental_marking_duration_ == 0.0) return 0; 379 if (cumulative_incremental_marking_duration_ == 0.0) return 0;
365 380
366 // We haven't completed an entire round of incremental marking, yet. 381 // We haven't completed an entire round of incremental marking, yet.
367 // Use data from GCTracer instead of data from event buffers. 382 // Use data from GCTracer instead of data from event buffers.
368 if (mark_compactor_events_.empty()) { 383 if (mark_compactor_events_.empty()) {
369 return static_cast<intptr_t>(cumulative_incremental_marking_bytes_ / 384 return static_cast<intptr_t>(cumulative_incremental_marking_bytes_ /
370 cumulative_incremental_marking_duration_); 385 cumulative_pure_incremental_marking_duration_);
371 } 386 }
372 387
373 intptr_t bytes = 0; 388 intptr_t bytes = 0;
374 double durations = 0.0; 389 double durations = 0.0;
375 EventBuffer::const_iterator iter = mark_compactor_events_.begin(); 390 EventBuffer::const_iterator iter = mark_compactor_events_.begin();
376 while (iter != mark_compactor_events_.end()) { 391 while (iter != mark_compactor_events_.end()) {
377 bytes += iter->incremental_marking_bytes; 392 bytes += iter->incremental_marking_bytes;
378 durations += iter->incremental_marking_duration; 393 durations += iter->pure_incremental_marking_duration;
379 ++iter; 394 ++iter;
380 } 395 }
381 396
382 if (durations == 0.0) return 0; 397 if (durations == 0.0) return 0;
383 398
384 return static_cast<intptr_t>(bytes / durations); 399 return static_cast<intptr_t>(bytes / durations);
385 } 400 }
386 } 401 }
387 } // namespace v8::internal 402 } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap/gc-tracer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698