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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/timeline/TimelineJSProfile.js

Issue 1624783002: DevTools: Switch to using fast stack iterator to collect stacks during timeline recording. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressing comments Created 4 years, 11 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium 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 5
6 WebInspector.TimelineJSProfileProcessor = { }; 6 WebInspector.TimelineJSProfileProcessor = { };
7 7
8 /** 8 /**
9 * @param {!ProfilerAgent.CPUProfile} jsProfile 9 * @param {!ProfilerAgent.CPUProfile} jsProfile
10 * @param {!WebInspector.TracingModel.Thread} thread 10 * @param {!WebInspector.TracingModel.Thread} thread
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 if (depth < lockedDepth) { 147 if (depth < lockedDepth) {
148 console.error("Child stack is shallower (" + depth + ") than the parent stack (" + lockedDepth + ") at " + time); 148 console.error("Child stack is shallower (" + depth + ") than the parent stack (" + lockedDepth + ") at " + time);
149 depth = lockedDepth; 149 depth = lockedDepth;
150 } 150 }
151 } 151 }
152 if (jsFramesStack.length < depth) { 152 if (jsFramesStack.length < depth) {
153 console.error("Trying to truncate higher than the current stack size at " + time); 153 console.error("Trying to truncate higher than the current stack size at " + time);
154 depth = jsFramesStack.length; 154 depth = jsFramesStack.length;
155 } 155 }
156 var minFrameDurationMs = currentSamplingIntervalMs / 2; 156 var minFrameDurationMs = currentSamplingIntervalMs / 2;
157 for (var k = 0; k < depth; ++k)
158 jsFramesStack[k].setEndTime(time);
157 for (var k = depth; k < jsFramesStack.length; ++k) 159 for (var k = depth; k < jsFramesStack.length; ++k)
158 jsFramesStack[k].setEndTime(Math.min(eventEndTime(jsFramesStack[k]) + minFrameDurationMs, time)); 160 jsFramesStack[k].setEndTime(Math.min(eventEndTime(jsFramesStack[k]) + minFrameDurationMs, time));
159 jsFramesStack.length = depth; 161 jsFramesStack.length = depth;
160 } 162 }
161 163
162 /** 164 /**
163 * @param {!Array<!ConsoleAgent.CallFrame>} stack 165 * @param {!Array<!ConsoleAgent.CallFrame>} stack
164 */ 166 */
165 function filterStackFrames(stack) 167 function filterStackFrames(stack)
166 { 168 {
167 for (var i = 0, j = 0; i < stack.length; ++i) { 169 for (var i = 0, j = 0; i < stack.length; ++i) {
168 var url = stack[i].url; 170 var url = stack[i].url;
169 if (url && url.startsWith("native ")) 171 if (url && url.startsWith("native "))
170 continue; 172 continue;
171 stack[j++] = stack[i]; 173 stack[j++] = stack[i];
172 } 174 }
173 stack.length = j; 175 stack.length = j;
174 } 176 }
175 177
176 /** 178 /**
177 * @param {!WebInspector.TracingModel.Event} e 179 * @param {!WebInspector.TracingModel.Event} e
178 */ 180 */
179 function extractStackTrace(e) 181 function extractStackTrace(e)
180 { 182 {
183 var recordTypes = WebInspector.TimelineModel.RecordType;
181 var eventData = e.args["data"] || e.args["beginData"]; 184 var eventData = e.args["data"] || e.args["beginData"];
182 var stackTrace = eventData && eventData["stackTrace"]; 185 var stackTrace = eventData && eventData["stackTrace"];
183 var recordTypes = WebInspector.TimelineModel.RecordType; 186 if (!stackTrace) {
184 // GC events do not hold call stack, so make a copy of the current stack . 187 stackTrace = jsFramesStack.map(frameEvent => frameEvent.args["data"] ).reverse();
185 if (e.name === recordTypes.GCEvent || e.name === recordTypes.MajorGC || e.name === recordTypes.MinorGC) 188 if (eventData && stackTrace.length)
186 stackTrace = jsFramesStack.map(function(frameEvent) { return frameEv ent.args["data"]; }).reverse(); 189 eventData["stackTrace"] = stackTrace;
187 if (!stackTrace) 190 }
191 if (!stackTrace.length)
188 return; 192 return;
189 if (filterNativeFunctions) 193 if (filterNativeFunctions)
190 filterStackFrames(stackTrace); 194 filterStackFrames(stackTrace);
191 var endTime = eventEndTime(e); 195 var endTime = eventEndTime(e);
192 var numFrames = stackTrace.length; 196 var numFrames = stackTrace.length;
193 var minFrames = Math.min(numFrames, jsFramesStack.length); 197 var minFrames = Math.min(numFrames, jsFramesStack.length);
194 var i; 198 var i;
195 for (i = lockedJsStackDepth.peekLast() || 0; i < minFrames; ++i) { 199 for (i = lockedJsStackDepth.peekLast() || 0; i < minFrames; ++i) {
196 var newFrame = stackTrace[numFrames - 1 - i]; 200 var newFrame = stackTrace[numFrames - 1 - i];
197 var oldFrame = jsFramesStack[i].args["data"]; 201 var oldFrame = jsFramesStack[i].args["data"];
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 WebInspector.TracingModel.Phase.Instant, e.startTime, e.thread); 509 WebInspector.TracingModel.Phase.Instant, e.startTime, e.thread);
506 sampleEvent.ordinal = e.ordinal; 510 sampleEvent.ordinal = e.ordinal;
507 sampleEvent.args = {"data": {"stackTrace": stack }}; 511 sampleEvent.args = {"data": {"stackTrace": stack }};
508 samples.push(sampleEvent); 512 samples.push(sampleEvent);
509 break; 513 break;
510 } 514 }
511 } 515 }
512 516
513 return samples; 517 return samples;
514 } 518 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698