Changeset 173939 in webkit


Ignore:
Timestamp:
Sep 24, 2014 5:25:31 PM (10 years ago)
Author:
Brian Burg
Message:

Web Inspector: subtract elapsed time while debugger is paused from profile nodes
https://bugs.webkit.org/show_bug.cgi?id=136796

Reviewed by Timothy Hatcher.

Source/JavaScriptCore:

Rather than accruing no time to any profile node created while the debugger is paused,
we can instead count a node's elapsed time and exclude time elapsed while paused.

Time for a node may elapse in a non-contiguous fashion depending on the interleaving of
didPause, didContinue, willExecute, and didExecute. A node's start time is set to the
start of the last such interval that accrues elapsed time.

  • profiler/ProfileGenerator.cpp:

(JSC::ProfileGenerator::ProfileGenerator):
(JSC::ProfileGenerator::beginCallEntry):
(JSC::ProfileGenerator::endCallEntry):
(JSC::ProfileGenerator::didPause): Added.
(JSC::ProfileGenerator::didContinue): Added.

  • profiler/ProfileGenerator.h:

(JSC::ProfileGenerator::didPause): Deleted.
(JSC::ProfileGenerator::didContinue): Deleted.

  • profiler/ProfileNode.h: Rename totalTime to elapsedTime.

(JSC::ProfileNode::Call::Call):
(JSC::ProfileNode::Call::elapsedTime): Added.
(JSC::ProfileNode::Call::setElapsedTime): Added.
(JSC::CalculateProfileSubtreeDataFunctor::operator()):
(JSC::ProfileNode::Call::totalTime): Deleted.
(JSC::ProfileNode::Call::setTotalTime): Deleted.

Source/WebCore:

  • inspector/TimelineRecordFactory.cpp:

(WebCore::buildInspectorObject):

Location:
trunk/Source
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r173911 r173939  
     12014-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
    1322014-09-24  Commit Queue  <commit-queue@webkit.org>
    233
  • trunk/Source/JavaScriptCore/profiler/ProfileGenerator.cpp

    r173264 r173939  
    4949    : m_origin(exec ? exec->lexicalGlobalObject() : nullptr)
    5050    , m_profileGroup(exec ? exec->lexicalGlobalObject()->profileGroup() : 0)
     51    , m_debuggerPausedTimestamp(NAN)
    5152    , m_foundConsoleStartParent(false)
    52     , m_debuggerPaused(false)
    5353{
    5454    if (Debugger* debugger = exec->lexicalGlobalObject()->debugger())
    55         m_debuggerPaused = debugger->isPaused();
     55        m_debuggerPausedTimestamp = debugger->isPaused() ? currentTime() : NAN;
    5656
    5757    m_profile = Profile::create(title, uid);
     
    119119    if (isnan(startTime))
    120120        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
    121127    node->appendCall(ProfileNode::Call(startTime));
    122128}
     
    127133
    128134    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);
    132152}
    133153
     
    197217}
    198218
     219void 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
     236void 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
    199246void ProfileGenerator::stopProfiling()
    200247{
  • trunk/Source/JavaScriptCore/profiler/ProfileGenerator.h

    r173264 r173939  
    5555        void exceptionUnwind(ExecState* handlerCallFrame, const CallIdentifier&);
    5656
    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&);
    5959
    6060        void stopProfiling();
     
    7575        JSGlobalObject* m_origin;
    7676        unsigned m_profileGroup;
     77        // Timestamp is set to NAN when the debugger is not currently paused.
     78        double m_debuggerPausedTimestamp;
    7779        RefPtr<ProfileNode> m_rootNode;
    7880        RefPtr<ProfileNode> m_currentNode;
    7981        bool m_foundConsoleStartParent;
    80         bool m_debuggerPaused;
    8182    };
    8283
  • trunk/Source/JavaScriptCore/profiler/ProfileNode.h

    r173262 r173939  
    5757        struct Call {
    5858        public:
    59             Call(double startTime, double totalTime = NAN)
     59            Call(double startTime, double elapsedTime = NAN)
    6060                : m_startTime(startTime)
    61                 , m_totalTime(totalTime)
     61                , m_elapsedTime(elapsedTime)
    6262            {
    6363            }
     
    6666            void setStartTime(double time)
    6767            {
    68                 ASSERT_ARG(time, time >= 0.0);
     68                ASSERT_ARG(time, time >= 0.0 || isnan(time));
    6969                m_startTime = time;
    7070            }
    7171
    72             double totalTime() const { return m_totalTime; }
    73             void setTotalTime(double time)
     72            double elapsedTime() const { return m_elapsedTime; }
     73            void setElapsedTime(double time)
    7474            {
    75                 ASSERT_ARG(time, time >= 0.0);
    76                 m_totalTime = time;
     75                ASSERT_ARG(time, time >= 0.0 || isnan(time));
     76                m_elapsedTime = time;
    7777            }
    7878
    7979        private:
    8080            double m_startTime;
    81             double m_totalTime;
     81            double m_elapsedTime;
    8282        };
    8383
     
    171171            double selfTime = 0.0;
    172172            for (const ProfileNode::Call& call : node->calls())
    173                 selfTime += call.totalTime();
     173                selfTime += call.elapsedTime();
    174174
    175175            double totalTime = selfTime;
  • trunk/Source/WebCore/ChangeLog

    r173932 r173939  
     12014-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
    1112014-09-24  Christophe Dumez  <cdumez@apple.com>
    212
  • trunk/Source/WebCore/inspector/TimelineRecordFactory.cpp

    r173554 r173939  
    275275    RefPtr<Protocol::Timeline::CPUProfileNodeCall> result = Protocol::Timeline::CPUProfileNodeCall::create()
    276276        .setStartTime(call.startTime())
    277         .setTotalTime(call.totalTime());
     277        .setTotalTime(call.elapsedTime());
    278278    return result.release();
    279279}
Note: See TracChangeset for help on using the changeset viewer.