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

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: update profiler tests Created 4 years, 10 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 {
181 var eventData = e.args["data"] || e.args["beginData"];
182 var stackTrace = eventData && eventData["stackTrace"];
183 var recordTypes = WebInspector.TimelineModel.RecordType; 183 var recordTypes = WebInspector.TimelineModel.RecordType;
184 // GC events do not hold call stack, so make a copy of the current stack . 184 var stackTrace;
185 if (e.name === recordTypes.GCEvent || e.name === recordTypes.MajorGC || e.name === recordTypes.MinorGC) 185 if (e.name === recordTypes.JSSample) {
186 stackTrace = jsFramesStack.map(function(frameEvent) { return frameEv ent.args["data"]; }).reverse(); 186 var eventData = e.args["data"] || e.args["beginData"];
187 if (!stackTrace) 187 stackTrace = /** @type {!Array<!ConsoleAgent.CallFrame>} */ (eventDa ta && eventData["stackTrace"]);
188 return; 188 } else {
189 stackTrace = /** @type {!Array<!ConsoleAgent.CallFrame>} */ (jsFrame sStack.map(frameEvent => frameEvent.args["data"]).reverse());
190 }
189 if (filterNativeFunctions) 191 if (filterNativeFunctions)
190 filterStackFrames(stackTrace); 192 filterStackFrames(stackTrace);
191 var endTime = eventEndTime(e); 193 var endTime = eventEndTime(e);
192 var numFrames = stackTrace.length; 194 var numFrames = stackTrace.length;
193 var minFrames = Math.min(numFrames, jsFramesStack.length); 195 var minFrames = Math.min(numFrames, jsFramesStack.length);
194 var i; 196 var i;
195 for (i = lockedJsStackDepth.peekLast() || 0; i < minFrames; ++i) { 197 for (i = lockedJsStackDepth.peekLast() || 0; i < minFrames; ++i) {
196 var newFrame = stackTrace[numFrames - 1 - i]; 198 var newFrame = stackTrace[numFrames - 1 - i];
197 var oldFrame = jsFramesStack[i].args["data"]; 199 var oldFrame = jsFramesStack[i].args["data"];
198 if (!equalFrames(newFrame, oldFrame)) 200 if (!equalFrames(newFrame, oldFrame))
199 break; 201 break;
200 jsFramesStack[i].setEndTime(Math.max(jsFramesStack[i].endTime, endTi me)); 202 jsFramesStack[i].setEndTime(Math.max(jsFramesStack[i].endTime, endTi me));
201 } 203 }
202 truncateJSStack(i, e.startTime); 204 truncateJSStack(i, e.startTime);
203 for (; i < numFrames; ++i) { 205 for (; i < numFrames; ++i) {
204 var frame = stackTrace[numFrames - 1 - i]; 206 var frame = stackTrace[numFrames - 1 - i];
205 var jsFrameEvent = new WebInspector.TracingModel.Event(WebInspector. TracingModel.DevToolsTimelineEventCategory, WebInspector.TimelineModel.RecordTyp e.JSFrame, 207 var jsFrameEvent = new WebInspector.TracingModel.Event(WebInspector. TracingModel.DevToolsTimelineEventCategory, recordTypes.JSFrame,
206 WebInspector.TracingModel.Phase.Complete, e.startTime, e.thread) ; 208 WebInspector.TracingModel.Phase.Complete, e.startTime, e.thread) ;
207 jsFrameEvent.ordinal = e.ordinal; 209 jsFrameEvent.ordinal = e.ordinal;
208 jsFrameEvent.addArgs({ data: frame }); 210 jsFrameEvent.addArgs({ data: frame });
209 jsFrameEvent.setEndTime(endTime); 211 jsFrameEvent.setEndTime(endTime);
210 jsFramesStack.push(jsFrameEvent); 212 jsFramesStack.push(jsFrameEvent);
211 jsFrameEvents.push(jsFrameEvent); 213 jsFrameEvents.push(jsFrameEvent);
212 } 214 }
213 } 215 }
214 216
215 /** 217 /**
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 WebInspector.TracingModel.Phase.Instant, e.startTime, e.thread); 507 WebInspector.TracingModel.Phase.Instant, e.startTime, e.thread);
506 sampleEvent.ordinal = e.ordinal; 508 sampleEvent.ordinal = e.ordinal;
507 sampleEvent.args = {"data": {"stackTrace": stack }}; 509 sampleEvent.args = {"data": {"stackTrace": stack }};
508 samples.push(sampleEvent); 510 samples.push(sampleEvent);
509 break; 511 break;
510 } 512 }
511 } 513 }
512 514
513 return samples; 515 return samples;
514 } 516 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698