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

Side by Side Diff: tools/plot-timer-events.js

Issue 11428025: Include more information in --prof log. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years 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 | « tools/plot-timer-events ('k') | tools/tickprocessor.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution. 11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its 12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived 13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission. 14 // from this software without specific prior written permission.
15 // 15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 var kExecutionName = 'V8.Execute'; 28 var kV8BinarySuffixes = ["/d8", "/libv8.so"];
29 var kStackFrames = 16;
Jakob Kummerow 2012/11/28 09:18:47 As discussed offline, a smaller number is probably
29 30
30 var TimerEvents = { 31 var kTimerEventWidth = 0.33;
31 'V8.Execute': 32 var kExecutionFrameWidth = 0.2;
32 { ranges: [], color: "#444444", pause: false, index: 1 }, 33 var kStackFrameWidth = 0.1;
33 'V8.CompileFullCode': 34 var kGapWidth = 0.05;
34 { ranges: [], color: "#CC0000", pause: true, index: 2 },
35 'V8.RecompileSynchronous':
36 { ranges: [], color: "#CC0044", pause: true, index: 3 },
37 'V8.RecompileParallel':
38 { ranges: [], color: "#CC4499", pause: false, index: 4 },
39 'V8.CompileEval':
40 { ranges: [], color: "#CC4400", pause: true, index: 5 },
41 'V8.Parse':
42 { ranges: [], color: "#00CC00", pause: true, index: 6 },
43 'V8.PreParse':
44 { ranges: [], color: "#44CC00", pause: true, index: 7 },
45 'V8.ParseLazy':
46 { ranges: [], color: "#00CC44", pause: true, index: 8 },
47 'V8.GCScavenger':
48 { ranges: [], color: "#0044CC", pause: true, index: 9 },
49 'V8.GCCompactor':
50 { ranges: [], color: "#4444CC", pause: true, index: 10 },
51 'V8.GCContext':
52 { ranges: [], color: "#4400CC", pause: true, index: 11 },
53 }
54 35
55 var kNumRows = 11; 36 var kPauseTolerance = 0.1; // Milliseconds.
56 var kBarWidth = 0.33; 37 var kY1Offset = 12;
57 var kPauseTolerance = 0.05; // Milliseconds. 38
58 var kY1Offset = 3;
59 var kY2Factor = 5;
60 var kResX = 1600; 39 var kResX = 1600;
61 var kResY = 400; 40 var kResY = 600;
62 var kLabelPadding = 5; 41 var kPauseLabelPadding = 5;
63 var kNumPauseLabels = 7; 42 var kNumPauseLabels = 7;
43 var kTickHalfDuration = 0.5; // Milliseconds
44 var kCodeKindLabelPadding = 100;
64 45
65 var kOverrideRangeStart = undefined; 46 var kOverrideRangeStart = undefined;
66 var kOverrideRangeEnd = undefined; 47 var kOverrideRangeEnd = undefined;
67 48
49 var num_timer_event = kY1Offset + 0.5;
50
51
52 function TimerEvent(color, pause, no_execution) {
53 this.color = color;
54 this.pause = pause;
55 this.ranges = [];
56 this.no_execution = no_execution;
57 this.index = ++num_timer_event;
58 }
59
60
61 var TimerEvents = {
62 'V8.Execute': new TimerEvent("#000000", false, false),
63 'V8.External': new TimerEvent("#3399FF", false, true),
64 'V8.CompileFullCode': new TimerEvent("#CC0000", true, true),
65 'V8.RecompileSynchronous': new TimerEvent("#CC0044", true, true),
66 'V8.RecompileParallel': new TimerEvent("#CC4499", false, false),
67 'V8.CompileEval': new TimerEvent("#CC4400", true, true),
68 'V8.Parse': new TimerEvent("#00CC00", true, true),
69 'V8.PreParse': new TimerEvent("#44CC00", true, true),
70 'V8.ParseLazy': new TimerEvent("#00CC44", true, true),
71 'V8.GCScavenger': new TimerEvent("#0044CC", true, true),
72 'V8.GCCompactor': new TimerEvent("#4444CC", true, true),
73 'V8.GCContext': new TimerEvent("#4400CC", true, true),
74 }
75
76 var kExecutionEvent = TimerEvents['V8.Execute'];
77
78
79 function CodeKind(color, kinds) {
80 this.color = color;
81 this.in_execution = [];
82 this.stack_frames = [];
83 for (var i = 0; i < kStackFrames; i++) this.stack_frames.push([]);
84 this.kinds = kinds;
85 }
86
87
88 var CodeKinds = {
89 'external ': new CodeKind("#3399FF", [-3]),
90 'reg.exp. ': new CodeKind("#0000FF", [-2]),
91 'runtime ': new CodeKind("#000000", [-1]),
92 'full code': new CodeKind("#DD0000", [0]),
93 'opt code ': new CodeKind("#00EE00", [1]),
94 'code stub': new CodeKind("#FF00FF", [2]),
95 'built-in ': new CodeKind("#AA00AA", [3]),
96 'inl.cache': new CodeKind("#4444AA", [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]),
97 }
98
99
68 var xrange_start = Infinity; 100 var xrange_start = Infinity;
69 var xrange_end = 0; 101 var xrange_end = 0;
70 var obj_index = 0; 102 var obj_index = 0;
71 var execution_pauses = []; 103 var execution_pauses = [];
104 var code_map = new CodeMap();
72 105
73 106
74 function Range(start, end) { 107 function Range(start, end) {
75 // Everthing from here are in milliseconds. 108 // Everthing from here are in milliseconds.
76 this.start = start; 109 this.start = start;
77 this.end = end; 110 this.end = end;
78 } 111 }
79 112
80 113
81 Range.prototype.duration = function() { return this.end - this.start; } 114 Range.prototype.duration = function() { return this.end - this.start; }
82 115
83 116
84 function ProcessTimerEvent(name, start, length) { 117 function ProcessTimerEvent(name, start, length) {
85 var event = TimerEvents[name]; 118 var event = TimerEvents[name];
86 if (event === undefined) return; 119 if (event === undefined) return;
87 start /= 1000; // Convert to milliseconds. 120 start /= 1000; // Convert to milliseconds.
88 length /= 1000; 121 length /= 1000;
89 var end = start + length; 122 var end = start + length;
90 event.ranges.push(new Range(start, end)); 123 event.ranges.push(new Range(start, end));
91 if (name == kExecutionName) { 124 if (event == kExecutionEvent) {
92 if (start < xrange_start) xrange_start = start; 125 if (start < xrange_start) xrange_start = start;
93 if (end > xrange_end) xrange_end = end; 126 if (end > xrange_end) xrange_end = end;
94 } 127 }
95 } 128 }
96 129
97 130
131 function ProcessCodeCreateEvent(type, kind, address, size, name) {
132 var code_entry = new CodeMap.CodeEntry(size, name);
133 code_entry.kind = kind;
134 code_map.addCode(address, code_entry);
135 }
136
137
138 function ProcessCodeMoveEvent(from, to) {
139 code_map.moveCode(from, to);
140 }
141
142
143 function ProcessCodeDeleteEvent(address) {
144 code_map.deleteCode(address);
145 }
146
147
148 function ProcessSharedLibrary(name, start, end) {
149 var code_entry = new CodeMap.CodeEntry(end - start, name);
150 code_entry.kind = -3; // External code kind.
151 for (var i = 0; i < kV8BinarySuffixes.length; i++) {
152 var suffix = kV8BinarySuffixes[i];
153 if (name.indexOf(suffix, name.length - suffix.length) >= 0) {
154 code_entry.kind = -1; // V8 runtime code kind.
155 break;
156 }
157 }
158 code_map.addLibrary(start, code_entry);
159 }
160
161
162 function FindCodeKind(kind) {
163 for (name in CodeKinds) {
164 if (CodeKinds[name].kinds.indexOf(kind) >= 0) {
165 return CodeKinds[name];
166 }
167 }
168 }
169
170
171 function ProcessTickEvent(pc, sp, timer, unused_x, unused_y, vmstate, stack) {
172 timer /= 1000;
173 var tick = new Range(timer - kTickHalfDuration, timer + kTickHalfDuration);
174
175 var entry = code_map.findEntry(pc);
176 if (entry) {
177 FindCodeKind(entry.kind).in_execution.push(tick);
178 }
179
180 for (var i = 0; i < kStackFrames; i++) {
181 if (!stack[i]) break;
182 var entry = code_map.findEntry(stack[i]);
183 if (entry) {
184 FindCodeKind(entry.kind).stack_frames[i].push(tick);
185 }
186 }
187 }
188
189
98 function CollectData() { 190 function CollectData() {
99 // Collect data from log. 191 // Collect data from log.
100 var logreader = new LogReader( 192 var logreader = new LogReader(
101 { 'timer-event' : { parsers: [null, parseInt, parseInt], 193 { 'timer-event' : { parsers: [null, parseInt, parseInt],
102 processor: ProcessTimerEvent 194 processor: ProcessTimerEvent },
103 } }); 195 'shared-library': { parsers: [null, parseInt, parseInt],
196 processor: ProcessSharedLibrary },
197 'code-creation': { parsers: [null, parseInt, parseInt, parseInt, null],
198 processor: ProcessCodeCreateEvent },
199 'code-move': { parsers: [parseInt, parseInt],
200 processor: ProcessCodeMoveEvent },
201 'code-delete': { parsers: [parseInt],
202 processor: ProcessCodeDeleteEvent },
203 'tick': { parsers: [parseInt, parseInt, parseInt,
204 null, null, parseInt, 'var-args'],
205 processor: ProcessTickEvent },
206 });
104 207
105 var line; 208 var line;
106 while (line = readline()) { 209 while (line = readline()) {
107 logreader.processLogLine(line); 210 logreader.processLogLine(line);
108 } 211 }
109 212
110 // Collect execution pauses. 213 // Collect execution pauses.
111 for (name in TimerEvents) { 214 for (name in TimerEvents) {
112 var event = TimerEvents[name]; 215 var event = TimerEvents[name];
113 if (!event.pause) continue; 216 if (!event.pause) continue;
114 var ranges = event.ranges; 217 var ranges = event.ranges;
218 for (var j = 0; j < ranges.length; j++) execution_pauses.push(ranges[j]);
219 }
220 execution_pauses = MergeRanges(execution_pauses);
221
222 // Knock out time not spent in javascript execution. Note that this also
223 // includes time spent external code, which do not contribute to execution
224 // pauses.
225 var exclude_ranges = [];
226 for (name in TimerEvents) {
227 var event = TimerEvents[name];
228 if (!event.no_execution) continue;
229 var ranges = event.ranges;
115 // Add ranges of this event to the pause list. 230 // Add ranges of this event to the pause list.
116 for (var j = 0; j < ranges.length; j++) { 231 for (var j = 0; j < ranges.length; j++) {
117 execution_pauses.push(ranges[j]); 232 exclude_ranges.push(ranges[j]);
118 } 233 }
119 } 234 }
235
236 kExecutionEvent.ranges = MergeRanges(kExecutionEvent.ranges);
237 exclude_ranges = MergeRanges(exclude_ranges);
238 kExecutionEvent.ranges = ExcludeRanges(kExecutionEvent.ranges,
239 exclude_ranges);
120 } 240 }
121 241
122 242
123 function drawBar(row, color, start, end) { 243 function DrawBar(row, color, start, end, width) {
124 obj_index++; 244 obj_index++;
125 command = "set object " + obj_index + " rect"; 245 command = "set object " + obj_index + " rect";
126 command += " from " + start + ", " + (row - kBarWidth + kY1Offset); 246 command += " from " + start + ", " + (row - width);
127 command += " to " + end + ", " + (row + kBarWidth + kY1Offset); 247 command += " to " + end + ", " + (row + width);
128 command += " fc rgb \"" + color + "\""; 248 command += " fc rgb \"" + color + "\"";
129 print(command); 249 print(command);
130 } 250 }
131 251
132 252
133 function MergeRanges(ranges, merge_tolerance) { 253 function MergeRanges(ranges) {
134 ranges.sort(function(a, b) { return a.start - b.start; }); 254 ranges.sort(function(a, b) { return a.start - b.start; });
135 var result = []; 255 var result = [];
136 var j = 0; 256 var j = 0;
137 for (var i = 0; i < ranges.length; i = j) { 257 for (var i = 0; i < ranges.length; i = j) {
138 var merge_start = ranges[i].start; 258 var merge_start = ranges[i].start;
139 if (merge_start > xrange_end) break; // Out of plot range. 259 if (merge_start > xrange_end) break; // Out of plot range.
140 var merge_end = ranges[i].end; 260 var merge_end = ranges[i].end;
141 for (j = i + 1; j < ranges.length; j++) { 261 for (j = i + 1; j < ranges.length; j++) {
142 var next_range = ranges[j]; 262 var next_range = ranges[j];
143 // Don't merge ranges if there is no overlap (including merge tolerance). 263 // Don't merge ranges if there is no overlap (including merge tolerance).
144 if (next_range.start >= merge_end + kPauseTolerance) break; 264 if (next_range.start > merge_end + kPauseTolerance) break;
145 // Merge ranges. 265 // Merge ranges.
146 if (next_range.end > merge_end) { // Extend range end. 266 if (next_range.end > merge_end) { // Extend range end.
147 merge_end = next_range.end; 267 merge_end = next_range.end;
148 } 268 }
149 } 269 }
150 if (merge_end < xrange_start) continue; // Out of plot range. 270 if (merge_end < xrange_start) continue; // Out of plot range.
151 result.push(new Range(merge_start, merge_end)); 271 result.push(new Range(merge_start, merge_end));
152 } 272 }
153 return result; 273 return result;
154 } 274 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 } 352 }
233 } 353 }
234 354
235 return result; 355 return result;
236 } 356 }
237 357
238 358
239 function GnuplotOutput() { 359 function GnuplotOutput() {
240 xrange_start = kOverrideRangeStart ? kOverrideRangeStart : xrange_start; 360 xrange_start = kOverrideRangeStart ? kOverrideRangeStart : xrange_start;
241 xrange_end = kOverrideRangeEnd ? kOverrideRangeEnd : xrange_end; 361 xrange_end = kOverrideRangeEnd ? kOverrideRangeEnd : xrange_end;
242
243 print("set terminal pngcairo size " + kResX + "," + kResY + 362 print("set terminal pngcairo size " + kResX + "," + kResY +
244 " enhanced font 'Helvetica,10'"); 363 " enhanced font 'Helvetica,10'");
245 print("set yrange [0:" + (kNumRows + kY1Offset + 1) + "]"); 364 print("set yrange [0:" + (num_timer_event + 1) + "]");
246 print("set xlabel \"execution time in ms\""); 365 print("set xlabel \"execution time in ms\"");
247 print("set xrange [" + xrange_start + ":" + xrange_end + "]"); 366 print("set xrange [" + xrange_start + ":" + xrange_end + "]");
248 print("set style fill pattern 2 bo 1"); 367 print("set style fill pattern 2 bo 1");
249 print("set style rect fs solid 1 noborder"); 368 print("set style rect fs solid 1 noborder");
250 print("set style line 1 lt 1 lw 1 lc rgb \"#000000\""); 369 print("set style line 1 lt 1 lw 1 lc rgb \"#000000\"");
251 print("set xtics out nomirror"); 370 print("set xtics out nomirror");
252 print("unset key"); 371 print("unset key");
253 372
254 // Name Y-axis. 373 // Name Y-axis.
255 var ytics = []; 374 var ytics = [];
256 for (name in TimerEvents) { 375 for (name in TimerEvents) {
257 var index = TimerEvents[name].index; 376 var index = TimerEvents[name].index;
258 ytics.push('"' + name + '"' + ' ' + (index + kY1Offset)); 377 ytics.push('"' + name + '"' + ' ' + index);
259 } 378 }
379 ytics.push('"code kind being executed"' + ' ' + (kY1Offset - 1));
380 ytics.push('"top ' + kStackFrames + ' js stack frames"' + ' ' +
381 (kY1Offset - 2));
382 ytics.push('"pause times" 0');
260 print("set ytics out nomirror (" + ytics.join(', ') + ")"); 383 print("set ytics out nomirror (" + ytics.join(', ') + ")");
261 384
262 // Smallest visible gap given our resolution.
263 // We remove superfluous objects to go easy on Gnuplot.
264 var tolerance = (xrange_end - xrange_start) / kResX / 2;
265
266 // Sort, merge and remove invisible gaps for each time row.
267 for (var name in TimerEvents) {
268 var event = TimerEvents[name];
269 event.ranges = MergeRanges(event.ranges, tolerance);
270 }
271
272 // Knock out execution pauses.
273 var execution_event = TimerEvents[kExecutionName];
274 var exclude_ranges = MergeRanges(execution_pauses, tolerance);
275 execution_event.ranges = ExcludeRanges(execution_event.ranges,
276 exclude_ranges);
277 execution_event.ranges = MergeRanges(execution_event.ranges, tolerance);
278
279 // Plot timeline. 385 // Plot timeline.
280 for (var name in TimerEvents) { 386 for (var name in TimerEvents) {
281 var event = TimerEvents[name]; 387 var event = TimerEvents[name];
282 var ranges = event.ranges; 388 var ranges = MergeRanges(event.ranges);
283 for (var i = 0; i < ranges.length; i++) { 389 for (var i = 0; i < ranges.length; i++) {
284 drawBar(event.index, event.color, ranges[i].start, ranges[i].end); 390 DrawBar(event.index, event.color,
391 ranges[i].start, ranges[i].end,
392 kTimerEventWidth);
285 } 393 }
286 } 394 }
395
396 // Plot code kind gathered from ticks.
397 for (var name in CodeKinds) {
398 var code_kind = CodeKinds[name];
399 var offset = kY1Offset - 1;
400 // Top most frame.
401 var row = MergeRanges(code_kind.in_execution);
402 for (var j = 0; j < row.length; j++) {
403 DrawBar(offset, code_kind.color,
404 row[j].start, row[j].end, kExecutionFrameWidth);
405 }
406 offset = offset - 2 * kExecutionFrameWidth - kGapWidth;
407 // Javascript frames.
408 for (var i = 0; i < kStackFrames; i++) {
409 offset = offset - 2 * kStackFrameWidth - kGapWidth;
410 row = MergeRanges(code_kind.stack_frames[i]);
411 for (var j = 0; j < row.length; j++) {
412 DrawBar(offset, code_kind.color,
413 row[j].start, row[j].end, kStackFrameWidth);
414 }
415 }
416 }
417
418 // Add labels as legend for code kind colors.
419 var padding = kCodeKindLabelPadding * (xrange_end - xrange_start) / kResX;
420 var label_x = xrange_start;
421 var label_y = kY1Offset;
422 for (var name in CodeKinds) {
423 label_x += padding;
424 print("set label \"" + name + "\" at " + label_x + "," + label_y +
425 "textcolor rgb \"" + CodeKinds[name].color + "\" " +
426 "font \"Helvetica,9'\"");
427 }
287 428
288 if (execution_pauses.length == 0) { 429 if (execution_pauses.length == 0) {
289 // Force plot and return without plotting execution pause impulses. 430 // Force plot and return without plotting execution pause impulses.
290 print("plot 1/0"); 431 print("plot 1/0");
291 return; 432 return;
292 } 433 }
293 434
294 // Plot execution pauses as impulses. This may be better resolved
295 // due to possibly smaller merge tolerance.
296 if (tolerance > kPauseTolerance) {
297 execution_pauses = MergeRanges(execution_pauses, kPauseTolerance);
298 } else {
299 execution_pauses = exclude_ranges;
300 }
301
302 // Label the longest pauses. 435 // Label the longest pauses.
303 execution_pauses.sort( 436 execution_pauses.sort(
304 function(a, b) { return b.duration() - a.duration(); }); 437 function(a, b) { return b.duration() - a.duration(); });
305 438
306 var max_pause_time = execution_pauses[0].duration(); 439 var max_pause_time = execution_pauses[0].duration();
307 var padding = kLabelPadding * (xrange_end - xrange_start) / kResX; 440 padding = kPauseLabelPadding * (xrange_end - xrange_start) / kResX;
308 var y_scale = kY1Offset / max_pause_time; 441 var y_scale = kY1Offset / max_pause_time / 2;
309 for (var i = 0; i < execution_pauses.length && i < kNumPauseLabels; i++) { 442 for (var i = 0; i < execution_pauses.length && i < kNumPauseLabels; i++) {
310 var pause = execution_pauses[i]; 443 var pause = execution_pauses[i];
311 var label_content = (pause.duration() | 0) + " ms"; 444 var label_content = (pause.duration() | 0) + " ms";
312 var label_x = pause.end + padding; 445 var label_x = pause.end + padding;
313 var label_y = Math.max(1, (pause.duration() * y_scale)); 446 var label_y = Math.max(1, (pause.duration() * y_scale));
314 print("set label \"" + label_content + "\" at " + 447 print("set label \"" + label_content + "\" at " +
315 label_x + "," + label_y + " font \"Helvetica,7'\""); 448 label_x + "," + label_y + " font \"Helvetica,7'\"");
316 } 449 }
317 450
318 // Scale second Y-axis appropriately. 451 // Scale second Y-axis appropriately.
319 print("set y2range [0:" + (max_pause_time * kY2Factor) + "]"); 452 var y2range = max_pause_time * num_timer_event / kY1Offset * 2;
320 453 print("set y2range [0:" + y2range + "]");
321 // Plot graph with impulses as data set. 454 // Plot graph with impulses as data set.
322 print("plot '-' using 1:2 axes x1y2 with impulses ls 1"); 455 print("plot '-' using 1:2 axes x1y2 with impulses ls 1");
323 for (var i = 0; i < execution_pauses.length; i++) { 456 for (var i = 0; i < execution_pauses.length; i++) {
324 var pause = execution_pauses[i]; 457 var pause = execution_pauses[i];
325 print(pause.end + " " + pause.duration()); 458 print(pause.end + " " + pause.duration());
326 } 459 }
327 print("e"); 460 print("e");
328 } 461 }
329 462
330 463
331 CollectData(); 464 CollectData();
332 GnuplotOutput(); 465 GnuplotOutput();
OLDNEW
« no previous file with comments | « tools/plot-timer-events ('k') | tools/tickprocessor.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698