Changeset 173939 in webkit
- Timestamp:
- Sep 24, 2014 5:25:31 PM (10 years ago)
- Location:
- trunk/Source
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r173911 r173939 1 2014-09-24 Brian J. Burg <burg@cs.washington.edu> 2 3 Web Inspector: subtract elapsed time while debugger is paused from profile nodes 4 https://bugs.webkit.org/show_bug.cgi?id=136796 5 6 Reviewed by Timothy Hatcher. 7 8 Rather than accruing no time to any profile node created while the debugger is paused, 9 we can instead count a node's elapsed time and exclude time elapsed while paused. 10 11 Time for a node may elapse in a non-contiguous fashion depending on the interleaving of 12 didPause, didContinue, willExecute, and didExecute. A node's start time is set to the 13 start of the last such interval that accrues elapsed time. 14 15 * profiler/ProfileGenerator.cpp: 16 (JSC::ProfileGenerator::ProfileGenerator): 17 (JSC::ProfileGenerator::beginCallEntry): 18 (JSC::ProfileGenerator::endCallEntry): 19 (JSC::ProfileGenerator::didPause): Added. 20 (JSC::ProfileGenerator::didContinue): Added. 21 * profiler/ProfileGenerator.h: 22 (JSC::ProfileGenerator::didPause): Deleted. 23 (JSC::ProfileGenerator::didContinue): Deleted. 24 * profiler/ProfileNode.h: Rename totalTime to elapsedTime. 25 (JSC::ProfileNode::Call::Call): 26 (JSC::ProfileNode::Call::elapsedTime): Added. 27 (JSC::ProfileNode::Call::setElapsedTime): Added. 28 (JSC::CalculateProfileSubtreeDataFunctor::operator()): 29 (JSC::ProfileNode::Call::totalTime): Deleted. 30 (JSC::ProfileNode::Call::setTotalTime): Deleted. 31 1 32 2014-09-24 Commit Queue <commit-queue@webkit.org> 2 33 -
trunk/Source/JavaScriptCore/profiler/ProfileGenerator.cpp
r173264 r173939 49 49 : m_origin(exec ? exec->lexicalGlobalObject() : nullptr) 50 50 , m_profileGroup(exec ? exec->lexicalGlobalObject()->profileGroup() : 0) 51 , m_debuggerPausedTimestamp(NAN) 51 52 , m_foundConsoleStartParent(false) 52 , m_debuggerPaused(false)53 53 { 54 54 if (Debugger* debugger = exec->lexicalGlobalObject()->debugger()) 55 m_debuggerPaused = debugger->isPaused();55 m_debuggerPausedTimestamp = debugger->isPaused() ? currentTime() : NAN; 56 56 57 57 m_profile = Profile::create(title, uid); … … 119 119 if (isnan(startTime)) 120 120 startTime = currentTime(); 121 122 // If the debugger is paused when beginning, then don't set the start time. It 123 // will be fixed up when the debugger unpauses or the call entry ends. 124 if (!isnan(m_debuggerPausedTimestamp)) 125 startTime = NAN; 126 121 127 node->appendCall(ProfileNode::Call(startTime)); 122 128 } … … 127 133 128 134 ProfileNode::Call& last = node->lastCall(); 129 ASSERT(isnan(last.totalTime())); 130 131 last.setTotalTime(m_debuggerPaused ? 0.0 : currentTime() - last.startTime()); 135 136 // If the debugger is paused, ignore the interval that ends now. 137 if (!isnan(m_debuggerPausedTimestamp) && !isnan(last.elapsedTime())) 138 return; 139 140 // If paused and no time was accrued then the debugger was never unpaused. The call will 141 // have no time accrued and appear to have started when the debugger was paused. 142 if (!isnan(m_debuggerPausedTimestamp)) { 143 last.setStartTime(m_debuggerPausedTimestamp); 144 last.setElapsedTime(0.0); 145 return; 146 } 147 148 // Otherwise, add the interval ending now to elapsed time. 149 double previousElapsedTime = isnan(last.elapsedTime()) ? 0.0 : last.elapsedTime(); 150 double newlyElapsedTime = currentTime() - last.startTime(); 151 last.setElapsedTime(previousElapsedTime + newlyElapsedTime); 132 152 } 133 153 … … 197 217 } 198 218 219 void ProfileGenerator::didPause(PassRefPtr<DebuggerCallFrame>, const CallIdentifier&) 220 { 221 ASSERT(isnan(m_debuggerPausedTimestamp)); 222 223 m_debuggerPausedTimestamp = currentTime(); 224 225 for (ProfileNode* node = m_currentNode.get(); node != m_profile->rootNode(); node = node->parent()) { 226 ProfileNode::Call& last = node->lastCall(); 227 ASSERT(!isnan(last.startTime())); 228 229 double previousElapsedTime = isnan(last.elapsedTime()) ? 0.0 : last.elapsedTime(); 230 double additionalElapsedTime = m_debuggerPausedTimestamp - last.startTime(); 231 last.setStartTime(NAN); 232 last.setElapsedTime(previousElapsedTime + additionalElapsedTime); 233 } 234 } 235 236 void ProfileGenerator::didContinue(PassRefPtr<DebuggerCallFrame>, const CallIdentifier&) 237 { 238 ASSERT(!isnan(m_debuggerPausedTimestamp)); 239 240 for (ProfileNode* node = m_currentNode.get(); node != m_profile->rootNode(); node = node->parent()) 241 node->lastCall().setStartTime(m_debuggerPausedTimestamp); 242 243 m_debuggerPausedTimestamp = NAN; 244 } 245 199 246 void ProfileGenerator::stopProfiling() 200 247 { -
trunk/Source/JavaScriptCore/profiler/ProfileGenerator.h
r173264 r173939 55 55 void exceptionUnwind(ExecState* handlerCallFrame, const CallIdentifier&); 56 56 57 void didPause(PassRefPtr<DebuggerCallFrame>, const CallIdentifier&) { m_debuggerPaused = true; }58 void didContinue(PassRefPtr<DebuggerCallFrame>, const CallIdentifier&) { m_debuggerPaused = false; }57 void didPause(PassRefPtr<DebuggerCallFrame>, const CallIdentifier&); 58 void didContinue(PassRefPtr<DebuggerCallFrame>, const CallIdentifier&); 59 59 60 60 void stopProfiling(); … … 75 75 JSGlobalObject* m_origin; 76 76 unsigned m_profileGroup; 77 // Timestamp is set to NAN when the debugger is not currently paused. 78 double m_debuggerPausedTimestamp; 77 79 RefPtr<ProfileNode> m_rootNode; 78 80 RefPtr<ProfileNode> m_currentNode; 79 81 bool m_foundConsoleStartParent; 80 bool m_debuggerPaused;81 82 }; 82 83 -
trunk/Source/JavaScriptCore/profiler/ProfileNode.h
r173262 r173939 57 57 struct Call { 58 58 public: 59 Call(double startTime, double totalTime = NAN)59 Call(double startTime, double elapsedTime = NAN) 60 60 : m_startTime(startTime) 61 , m_ totalTime(totalTime)61 , m_elapsedTime(elapsedTime) 62 62 { 63 63 } … … 66 66 void setStartTime(double time) 67 67 { 68 ASSERT_ARG(time, time >= 0.0 );68 ASSERT_ARG(time, time >= 0.0 || isnan(time)); 69 69 m_startTime = time; 70 70 } 71 71 72 double totalTime() const { return m_totalTime; }73 void set TotalTime(double time)72 double elapsedTime() const { return m_elapsedTime; } 73 void setElapsedTime(double time) 74 74 { 75 ASSERT_ARG(time, time >= 0.0 );76 m_ totalTime = time;75 ASSERT_ARG(time, time >= 0.0 || isnan(time)); 76 m_elapsedTime = time; 77 77 } 78 78 79 79 private: 80 80 double m_startTime; 81 double m_ totalTime;81 double m_elapsedTime; 82 82 }; 83 83 … … 171 171 double selfTime = 0.0; 172 172 for (const ProfileNode::Call& call : node->calls()) 173 selfTime += call. totalTime();173 selfTime += call.elapsedTime(); 174 174 175 175 double totalTime = selfTime; -
trunk/Source/WebCore/ChangeLog
r173932 r173939 1 2014-09-24 Brian J. Burg <burg@cs.washington.edu> 2 3 Web Inspector: subtract elapsed time while debugger is paused from profile nodes 4 https://bugs.webkit.org/show_bug.cgi?id=136796 5 6 Reviewed by Timothy Hatcher. 7 8 * inspector/TimelineRecordFactory.cpp: 9 (WebCore::buildInspectorObject): 10 1 11 2014-09-24 Christophe Dumez <cdumez@apple.com> 2 12 -
trunk/Source/WebCore/inspector/TimelineRecordFactory.cpp
r173554 r173939 275 275 RefPtr<Protocol::Timeline::CPUProfileNodeCall> result = Protocol::Timeline::CPUProfileNodeCall::create() 276 276 .setStartTime(call.startTime()) 277 .setTotalTime(call. totalTime());277 .setTotalTime(call.elapsedTime()); 278 278 return result.release(); 279 279 }
Note: See TracChangeset
for help on using the changeset viewer.