diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp index 1c60833745f..f6ba4d25c1a 100644 --- a/mozilla/htmlparser/src/CNavDTD.cpp +++ b/mozilla/htmlparser/src/CNavDTD.cpp @@ -78,6 +78,20 @@ static eHTMLTags gWhitespaceTags[]={ #include "nsElementTable.h" + +#ifdef RAPTOR_PERF_METRICS +# define START_TIMER() \ + if(mParser) mParser->mParseTime.Start(PR_FALSE); + +# define STOP_TIMER() \ + if(mParser) mParser->mParseTime.Stop(); + +#else +# define STOP_TIMER() +# define START_TIMER() +#endif + + /*************************************************************** This the ITagHandler deque deallocator, needed by the CTagHandlerRegister @@ -487,8 +501,6 @@ eAutoDetectResult CNavDTD::CanParse(nsString& aContentType, nsString& aCommand, } -PRTime gStartTime; - /** * * @update gess5/18/98 @@ -506,17 +518,15 @@ nsresult CNavDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString mHasOpenScript=PR_FALSE; if((aNotifySink) && (aSink)) { + STOP_TIMER(); + if(aSink && (!mSink)) { result=aSink->QueryInterface(kIHTMLContentSinkIID, (void **)&mSink); } - - -#ifdef RGESS_DEBUG - gStartTime = PR_Now(); - printf("Begin parsing...\n"); -#endif - result = aSink->WillBuildModel(); + + START_TIMER(); + CStartToken theToken(eHTMLTag_html); HandleStartToken(&theToken); @@ -603,15 +613,6 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse } } - #ifdef RGESS_DEBUG - PRTime theEnd= PR_Now(); - PRTime creates, ustoms; - LL_I2L(ustoms, 1000); - LL_SUB(creates, theEnd, gStartTime); - LL_DIV(creates, creates, ustoms); - printf("End parse elapsed: %lldms\n",creates); - #endif - //let's only grab this state once! if(!gShowCRC) { gShowCRC=1; //this only indicates we'll not initialize again. @@ -623,6 +624,8 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse } } + STOP_TIMER(); + if(2==gShowCRC) { if(mComputedCRC32!=mExpectedCRC32) { if(mExpectedCRC32!=0) { @@ -641,6 +644,9 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse if(mDTDDebug) { mDTDDebug->DumpVectorRecord(); } + + START_TIMER(); + } } } @@ -821,10 +827,16 @@ nsresult CNavDTD::DidHandleStartTag(nsCParserNode& aNode,eHTMLTags aChildTag){ case eHTMLTag_xmp: //grab the skipped content and dump it out as text... { + + STOP_TIMER(); + const nsString& theText=aNode.GetSkippedContent(); if(0AddLeaf(*theNode); + + START_TIMER(); + break; case eHTMLTag_image: @@ -1634,7 +1652,12 @@ nsresult CNavDTD::HandleCommentToken(CToken* aToken) { WriteTokenToLog(aToken); #endif + STOP_TIMER(); + nsresult result=(mSink) ? mSink->AddComment(aNode) : NS_OK; + + START_TIMER(); + return result; } @@ -1704,7 +1727,12 @@ nsresult CNavDTD::HandleProcessingInstructionToken(CToken* aToken){ WriteTokenToLog(aToken); #endif + STOP_TIMER(); + nsresult result=(mSink) ? mSink->AddProcessingInstruction(aNode) : NS_OK; + + START_TIMER(); + return result; } @@ -1731,7 +1759,13 @@ nsresult CNavDTD::HandleDocTypeDeclToken(CToken* aToken){ mLineNumber += (docTypeStr).CountChar(kNewLine); docTypeStr.Trim(""); nsCParserNode theNode((CHTMLToken*)aToken,mLineNumber,mTokenizer->GetTokenRecycler()); + + STOP_TIMER(); + result = (mSink)? mSink->AddDocTypeDecl(theNode, pc->mParseMode):NS_OK; + + START_TIMER(); + } return result; } @@ -2235,7 +2269,12 @@ nsresult CNavDTD::CloseTransientStyles(eHTMLTags aChildTag){ nsresult CNavDTD::OpenHTML(const nsIParserNode& aNode){ NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos); + STOP_TIMER(); + nsresult result=(mSink) ? mSink->OpenHTML(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Push((eHTMLTags)aNode.GetNodeType()); return result; } @@ -2251,7 +2290,13 @@ nsresult CNavDTD::OpenHTML(const nsIParserNode& aNode){ */ nsresult CNavDTD::CloseHTML(const nsIParserNode& aNode){ NS_PRECONDITION(mBodyContext->GetCount() > 0, kInvalidTagStackPos); + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->CloseHTML(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Pop(); return result; } @@ -2268,9 +2313,15 @@ nsresult CNavDTD::CloseHTML(const nsIParserNode& aNode){ nsresult CNavDTD::OpenHead(const nsIParserNode& aNode){ //mBodyContext->Push(eHTMLTag_head); nsresult result=NS_OK; + + STOP_TIMER(); + if(!mHasOpenHead++) { result=(mSink) ? mSink->OpenHead(aNode) : NS_OK; } + + START_TIMER(); + return result; } @@ -2286,7 +2337,13 @@ nsresult CNavDTD::CloseHead(const nsIParserNode& aNode){ nsresult result=NS_OK; if(mHasOpenHead) { if(0==--mHasOpenHead){ + + STOP_TIMER(); + result=(mSink) ? mSink->CloseHead(aNode) : NS_OK; + + START_TIMER(); + } } //mBodyContext->Pop(); @@ -2324,7 +2381,13 @@ nsresult CNavDTD::OpenBody(const nsIParserNode& aNode){ } if(NS_OK==result) { + + STOP_TIMER(); + result=(mSink) ? mSink->OpenBody(aNode) : NS_OK; + + START_TIMER(); + if(!theBodyIsOpen) { mBodyContext->Push((eHTMLTags)aNode.GetNodeType()); mTokenizer->PrependTokens(mMisplacedContent); @@ -2344,7 +2407,13 @@ nsresult CNavDTD::OpenBody(const nsIParserNode& aNode){ */ nsresult CNavDTD::CloseBody(const nsIParserNode& aNode){ NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos); + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->CloseBody(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Pop(); return result; } @@ -2360,7 +2429,13 @@ nsresult CNavDTD::CloseBody(const nsIParserNode& aNode){ nsresult CNavDTD::OpenForm(const nsIParserNode& aNode){ if(mHasOpenForm) CloseForm(aNode); + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->OpenForm(aNode) : NS_OK; + + START_TIMER(); + if(NS_OK==result) mHasOpenForm=PR_TRUE; return result; @@ -2379,7 +2454,13 @@ nsresult CNavDTD::CloseForm(const nsIParserNode& aNode){ nsresult result=NS_OK; if(mHasOpenForm) { mHasOpenForm=PR_FALSE; + + STOP_TIMER(); + result=(mSink) ? mSink->CloseForm(aNode) : NS_OK; + + START_TIMER(); + } return result; } @@ -2395,7 +2476,13 @@ nsresult CNavDTD::CloseForm(const nsIParserNode& aNode){ nsresult CNavDTD::OpenMap(const nsIParserNode& aNode){ if(mHasOpenMap) CloseMap(aNode); + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->OpenMap(aNode) : NS_OK; + + START_TIMER(); + if(NS_OK==result) { mBodyContext->Push((eHTMLTags)aNode.GetNodeType()); mHasOpenMap=PR_TRUE; @@ -2416,7 +2503,13 @@ nsresult CNavDTD::CloseMap(const nsIParserNode& aNode){ nsresult result=NS_OK; if(mHasOpenMap) { mHasOpenMap=PR_FALSE; + + STOP_TIMER(); + result=(mSink) ? mSink->CloseMap(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Pop(); } return result; @@ -2434,7 +2527,13 @@ nsresult CNavDTD::OpenFrameset(const nsIParserNode& aNode){ NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos); mHadFrameset=PR_TRUE; + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->OpenFrameset(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Push((eHTMLTags)aNode.GetNodeType()); mHadFrameset=PR_TRUE; return result; @@ -2450,7 +2549,13 @@ nsresult CNavDTD::OpenFrameset(const nsIParserNode& aNode){ */ nsresult CNavDTD::CloseFrameset(const nsIParserNode& aNode){ NS_PRECONDITION(mBodyContext->GetCount() > 0, kInvalidTagStackPos); + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->CloseFrameset(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Pop(); return result; } @@ -2530,7 +2635,13 @@ CNavDTD::OpenContainer(const nsIParserNode& aNode,PRBool aClosedByStartTag){ break; default: + + STOP_TIMER(); + result=(mSink) ? mSink->OpenContainer(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Push((eHTMLTags)aNode.GetNodeType()); break; } @@ -2594,7 +2705,13 @@ CNavDTD::CloseContainer(const nsIParserNode& aNode,eHTMLTags aTag,PRBool aClosed case eHTMLTag_title: default: + + STOP_TIMER(); + result=(mSink) ? mSink->CloseContainer(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Pop(); break; } @@ -2716,7 +2833,13 @@ nsresult CNavDTD::AddLeaf(const nsIParserNode& aNode){ if(mSink){ eHTMLTags theTag=(eHTMLTags)aNode.GetNodeType(); OpenTransientStyles(theTag); + + STOP_TIMER(); + result=mSink->AddLeaf(aNode); + + START_TIMER(); + } return result; } @@ -2947,7 +3070,13 @@ nsITokenizer* CNavDTD::GetTokenizer(void) { * @return */ nsresult CNavDTD::WillResumeParse(void){ + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->WillResume() : NS_OK; + + START_TIMER(); + return result; } @@ -2958,7 +3087,13 @@ nsresult CNavDTD::WillResumeParse(void){ * @return error code */ nsresult CNavDTD::WillInterruptParse(void){ + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->WillInterrupt() : NS_OK; + + START_TIMER(); + return result; } diff --git a/mozilla/htmlparser/src/nsParser.cpp b/mozilla/htmlparser/src/nsParser.cpp index 7569b92c853..199ba970086 100644 --- a/mozilla/htmlparser/src/nsParser.cpp +++ b/mozilla/htmlparser/src/nsParser.cpp @@ -194,6 +194,11 @@ nsParser::nsParser(nsITokenObserver* anObserver) : mCommand(""), mUnusedInput("" mDTDVerification=PR_FALSE; mCharsetSource=kCharsetUninitialized; mInternalState=NS_OK; + +#ifdef RAPTOR_PERF_METRICS + + mParseTime.Reset(); +#endif } @@ -635,6 +640,9 @@ nsresult nsParser::EnableParser(PRBool aState){ if(result!=NS_OK) result=mInternalState; } + else { + NS_STOP_STOPWATCH(mParseTime); + } NS_STOP_STOPWATCH(mTotalTime) @@ -649,9 +657,7 @@ nsresult nsParser::EnableParser(PRBool aState){ * @update vidur 4/12/99 * @return current state */ -PRBool -nsParser::IsParserEnabled() -{ +PRBool nsParser::IsParserEnabled() { return mParserContext->mParserEnabled; } @@ -669,6 +675,7 @@ nsParser::IsParserEnabled() */ nsresult nsParser::Parse(nsIURI* aURL,nsIStreamObserver* aListener,PRBool aVerifyEnabled, void* aKey,eParseMode aMode) { NS_START_STOPWATCH(mTotalTime) + NS_PRECONDITION(0!=aURL,kNullURL); nsresult result=kBadURL; @@ -713,6 +720,7 @@ nsresult nsParser::Parse(nsIURI* aURL,nsIStreamObserver* aListener,PRBool aVerif */ nsresult nsParser::Parse(nsIInputStream& aStream,PRBool aVerifyEnabled, void* aKey,eParseMode aMode){ NS_START_STOPWATCH(mTotalTime) + mDTDVerification=aVerifyEnabled; nsresult result=NS_ERROR_OUT_OF_MEMORY; @@ -902,6 +910,9 @@ nsresult nsParser::ParseFragment(const nsString& aSourceBuffer,void* aKey,nsITag nsresult nsParser::ResumeParse(nsIDTD* aDefaultDTD, PRBool aIsFinalChunk) { nsresult result=NS_OK; if(mParserContext->mParserEnabled && mInternalState!=NS_ERROR_HTMLPARSER_STOPPARSING) { + + NS_START_STOPWATCH(mParseTime) + result=WillBuildModel(mParserContext->mScanner->GetFilename(),aDefaultDTD); if(mParserContext->mDTD) { mParserContext->mDTD->WillResumeParse(); @@ -915,10 +926,18 @@ nsresult nsParser::ResumeParse(nsIDTD* aDefaultDTD, PRBool aIsFinalChunk) { ((eOnStop==mParserContext->mStreamListenerState) && (NS_OK==result))){ DidBuildModel(mStreamStatus); NS_STOP_STOPWATCH(mTotalTime); + NS_STOP_STOPWATCH(mParseTime); + + #ifdef RAPTOR_PERF_METRICS printf("Total Time: "); mTotalTime.Print(); printf("\n"); + + printf("Parse Time: "); + mParseTime.Print(); + printf("\n"); + #endif return mInternalState; } @@ -939,6 +958,8 @@ nsresult nsParser::ResumeParse(nsIDTD* aDefaultDTD, PRBool aIsFinalChunk) { } }//if + NS_STOP_STOPWATCH(mParseTime); + return result; } @@ -1288,7 +1309,7 @@ nsresult nsParser::OnDataAvailable(nsIURI* aURL, nsIInputStream *pIStream, PRUin printf("xmlencoding detect- %s\n", guess.ToNewCString()); #endif this->SetDocumentCharset(guess, guessSource); - mParserContext->mScanner->SetDocumentCharset(guess, guessSource); + mParserContext->mScanner->SetDocumentCharset(guess, guessSource); } } theTotalRead+=theNumRead; diff --git a/mozilla/htmlparser/src/nsParser.h b/mozilla/htmlparser/src/nsParser.h index 345f46056f8..1872515d1b7 100644 --- a/mozilla/htmlparser/src/nsParser.h +++ b/mozilla/htmlparser/src/nsParser.h @@ -381,9 +381,13 @@ protected: nsCharsetSource mCharsetSource; nsresult mInternalState; CObserverService mObserverService; + #ifdef RAPTOR_PERF_METRICS +public: Stopwatch mTotalTime; + Stopwatch mParseTime; #endif + }; diff --git a/mozilla/parser/htmlparser/src/CNavDTD.cpp b/mozilla/parser/htmlparser/src/CNavDTD.cpp index 1c60833745f..f6ba4d25c1a 100644 --- a/mozilla/parser/htmlparser/src/CNavDTD.cpp +++ b/mozilla/parser/htmlparser/src/CNavDTD.cpp @@ -78,6 +78,20 @@ static eHTMLTags gWhitespaceTags[]={ #include "nsElementTable.h" + +#ifdef RAPTOR_PERF_METRICS +# define START_TIMER() \ + if(mParser) mParser->mParseTime.Start(PR_FALSE); + +# define STOP_TIMER() \ + if(mParser) mParser->mParseTime.Stop(); + +#else +# define STOP_TIMER() +# define START_TIMER() +#endif + + /*************************************************************** This the ITagHandler deque deallocator, needed by the CTagHandlerRegister @@ -487,8 +501,6 @@ eAutoDetectResult CNavDTD::CanParse(nsString& aContentType, nsString& aCommand, } -PRTime gStartTime; - /** * * @update gess5/18/98 @@ -506,17 +518,15 @@ nsresult CNavDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString mHasOpenScript=PR_FALSE; if((aNotifySink) && (aSink)) { + STOP_TIMER(); + if(aSink && (!mSink)) { result=aSink->QueryInterface(kIHTMLContentSinkIID, (void **)&mSink); } - - -#ifdef RGESS_DEBUG - gStartTime = PR_Now(); - printf("Begin parsing...\n"); -#endif - result = aSink->WillBuildModel(); + + START_TIMER(); + CStartToken theToken(eHTMLTag_html); HandleStartToken(&theToken); @@ -603,15 +613,6 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse } } - #ifdef RGESS_DEBUG - PRTime theEnd= PR_Now(); - PRTime creates, ustoms; - LL_I2L(ustoms, 1000); - LL_SUB(creates, theEnd, gStartTime); - LL_DIV(creates, creates, ustoms); - printf("End parse elapsed: %lldms\n",creates); - #endif - //let's only grab this state once! if(!gShowCRC) { gShowCRC=1; //this only indicates we'll not initialize again. @@ -623,6 +624,8 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse } } + STOP_TIMER(); + if(2==gShowCRC) { if(mComputedCRC32!=mExpectedCRC32) { if(mExpectedCRC32!=0) { @@ -641,6 +644,9 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse if(mDTDDebug) { mDTDDebug->DumpVectorRecord(); } + + START_TIMER(); + } } } @@ -821,10 +827,16 @@ nsresult CNavDTD::DidHandleStartTag(nsCParserNode& aNode,eHTMLTags aChildTag){ case eHTMLTag_xmp: //grab the skipped content and dump it out as text... { + + STOP_TIMER(); + const nsString& theText=aNode.GetSkippedContent(); if(0AddLeaf(*theNode); + + START_TIMER(); + break; case eHTMLTag_image: @@ -1634,7 +1652,12 @@ nsresult CNavDTD::HandleCommentToken(CToken* aToken) { WriteTokenToLog(aToken); #endif + STOP_TIMER(); + nsresult result=(mSink) ? mSink->AddComment(aNode) : NS_OK; + + START_TIMER(); + return result; } @@ -1704,7 +1727,12 @@ nsresult CNavDTD::HandleProcessingInstructionToken(CToken* aToken){ WriteTokenToLog(aToken); #endif + STOP_TIMER(); + nsresult result=(mSink) ? mSink->AddProcessingInstruction(aNode) : NS_OK; + + START_TIMER(); + return result; } @@ -1731,7 +1759,13 @@ nsresult CNavDTD::HandleDocTypeDeclToken(CToken* aToken){ mLineNumber += (docTypeStr).CountChar(kNewLine); docTypeStr.Trim(""); nsCParserNode theNode((CHTMLToken*)aToken,mLineNumber,mTokenizer->GetTokenRecycler()); + + STOP_TIMER(); + result = (mSink)? mSink->AddDocTypeDecl(theNode, pc->mParseMode):NS_OK; + + START_TIMER(); + } return result; } @@ -2235,7 +2269,12 @@ nsresult CNavDTD::CloseTransientStyles(eHTMLTags aChildTag){ nsresult CNavDTD::OpenHTML(const nsIParserNode& aNode){ NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos); + STOP_TIMER(); + nsresult result=(mSink) ? mSink->OpenHTML(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Push((eHTMLTags)aNode.GetNodeType()); return result; } @@ -2251,7 +2290,13 @@ nsresult CNavDTD::OpenHTML(const nsIParserNode& aNode){ */ nsresult CNavDTD::CloseHTML(const nsIParserNode& aNode){ NS_PRECONDITION(mBodyContext->GetCount() > 0, kInvalidTagStackPos); + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->CloseHTML(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Pop(); return result; } @@ -2268,9 +2313,15 @@ nsresult CNavDTD::CloseHTML(const nsIParserNode& aNode){ nsresult CNavDTD::OpenHead(const nsIParserNode& aNode){ //mBodyContext->Push(eHTMLTag_head); nsresult result=NS_OK; + + STOP_TIMER(); + if(!mHasOpenHead++) { result=(mSink) ? mSink->OpenHead(aNode) : NS_OK; } + + START_TIMER(); + return result; } @@ -2286,7 +2337,13 @@ nsresult CNavDTD::CloseHead(const nsIParserNode& aNode){ nsresult result=NS_OK; if(mHasOpenHead) { if(0==--mHasOpenHead){ + + STOP_TIMER(); + result=(mSink) ? mSink->CloseHead(aNode) : NS_OK; + + START_TIMER(); + } } //mBodyContext->Pop(); @@ -2324,7 +2381,13 @@ nsresult CNavDTD::OpenBody(const nsIParserNode& aNode){ } if(NS_OK==result) { + + STOP_TIMER(); + result=(mSink) ? mSink->OpenBody(aNode) : NS_OK; + + START_TIMER(); + if(!theBodyIsOpen) { mBodyContext->Push((eHTMLTags)aNode.GetNodeType()); mTokenizer->PrependTokens(mMisplacedContent); @@ -2344,7 +2407,13 @@ nsresult CNavDTD::OpenBody(const nsIParserNode& aNode){ */ nsresult CNavDTD::CloseBody(const nsIParserNode& aNode){ NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos); + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->CloseBody(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Pop(); return result; } @@ -2360,7 +2429,13 @@ nsresult CNavDTD::CloseBody(const nsIParserNode& aNode){ nsresult CNavDTD::OpenForm(const nsIParserNode& aNode){ if(mHasOpenForm) CloseForm(aNode); + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->OpenForm(aNode) : NS_OK; + + START_TIMER(); + if(NS_OK==result) mHasOpenForm=PR_TRUE; return result; @@ -2379,7 +2454,13 @@ nsresult CNavDTD::CloseForm(const nsIParserNode& aNode){ nsresult result=NS_OK; if(mHasOpenForm) { mHasOpenForm=PR_FALSE; + + STOP_TIMER(); + result=(mSink) ? mSink->CloseForm(aNode) : NS_OK; + + START_TIMER(); + } return result; } @@ -2395,7 +2476,13 @@ nsresult CNavDTD::CloseForm(const nsIParserNode& aNode){ nsresult CNavDTD::OpenMap(const nsIParserNode& aNode){ if(mHasOpenMap) CloseMap(aNode); + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->OpenMap(aNode) : NS_OK; + + START_TIMER(); + if(NS_OK==result) { mBodyContext->Push((eHTMLTags)aNode.GetNodeType()); mHasOpenMap=PR_TRUE; @@ -2416,7 +2503,13 @@ nsresult CNavDTD::CloseMap(const nsIParserNode& aNode){ nsresult result=NS_OK; if(mHasOpenMap) { mHasOpenMap=PR_FALSE; + + STOP_TIMER(); + result=(mSink) ? mSink->CloseMap(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Pop(); } return result; @@ -2434,7 +2527,13 @@ nsresult CNavDTD::OpenFrameset(const nsIParserNode& aNode){ NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos); mHadFrameset=PR_TRUE; + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->OpenFrameset(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Push((eHTMLTags)aNode.GetNodeType()); mHadFrameset=PR_TRUE; return result; @@ -2450,7 +2549,13 @@ nsresult CNavDTD::OpenFrameset(const nsIParserNode& aNode){ */ nsresult CNavDTD::CloseFrameset(const nsIParserNode& aNode){ NS_PRECONDITION(mBodyContext->GetCount() > 0, kInvalidTagStackPos); + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->CloseFrameset(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Pop(); return result; } @@ -2530,7 +2635,13 @@ CNavDTD::OpenContainer(const nsIParserNode& aNode,PRBool aClosedByStartTag){ break; default: + + STOP_TIMER(); + result=(mSink) ? mSink->OpenContainer(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Push((eHTMLTags)aNode.GetNodeType()); break; } @@ -2594,7 +2705,13 @@ CNavDTD::CloseContainer(const nsIParserNode& aNode,eHTMLTags aTag,PRBool aClosed case eHTMLTag_title: default: + + STOP_TIMER(); + result=(mSink) ? mSink->CloseContainer(aNode) : NS_OK; + + START_TIMER(); + mBodyContext->Pop(); break; } @@ -2716,7 +2833,13 @@ nsresult CNavDTD::AddLeaf(const nsIParserNode& aNode){ if(mSink){ eHTMLTags theTag=(eHTMLTags)aNode.GetNodeType(); OpenTransientStyles(theTag); + + STOP_TIMER(); + result=mSink->AddLeaf(aNode); + + START_TIMER(); + } return result; } @@ -2947,7 +3070,13 @@ nsITokenizer* CNavDTD::GetTokenizer(void) { * @return */ nsresult CNavDTD::WillResumeParse(void){ + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->WillResume() : NS_OK; + + START_TIMER(); + return result; } @@ -2958,7 +3087,13 @@ nsresult CNavDTD::WillResumeParse(void){ * @return error code */ nsresult CNavDTD::WillInterruptParse(void){ + + STOP_TIMER(); + nsresult result=(mSink) ? mSink->WillInterrupt() : NS_OK; + + START_TIMER(); + return result; } diff --git a/mozilla/parser/htmlparser/src/nsParser.cpp b/mozilla/parser/htmlparser/src/nsParser.cpp index 7569b92c853..199ba970086 100644 --- a/mozilla/parser/htmlparser/src/nsParser.cpp +++ b/mozilla/parser/htmlparser/src/nsParser.cpp @@ -194,6 +194,11 @@ nsParser::nsParser(nsITokenObserver* anObserver) : mCommand(""), mUnusedInput("" mDTDVerification=PR_FALSE; mCharsetSource=kCharsetUninitialized; mInternalState=NS_OK; + +#ifdef RAPTOR_PERF_METRICS + + mParseTime.Reset(); +#endif } @@ -635,6 +640,9 @@ nsresult nsParser::EnableParser(PRBool aState){ if(result!=NS_OK) result=mInternalState; } + else { + NS_STOP_STOPWATCH(mParseTime); + } NS_STOP_STOPWATCH(mTotalTime) @@ -649,9 +657,7 @@ nsresult nsParser::EnableParser(PRBool aState){ * @update vidur 4/12/99 * @return current state */ -PRBool -nsParser::IsParserEnabled() -{ +PRBool nsParser::IsParserEnabled() { return mParserContext->mParserEnabled; } @@ -669,6 +675,7 @@ nsParser::IsParserEnabled() */ nsresult nsParser::Parse(nsIURI* aURL,nsIStreamObserver* aListener,PRBool aVerifyEnabled, void* aKey,eParseMode aMode) { NS_START_STOPWATCH(mTotalTime) + NS_PRECONDITION(0!=aURL,kNullURL); nsresult result=kBadURL; @@ -713,6 +720,7 @@ nsresult nsParser::Parse(nsIURI* aURL,nsIStreamObserver* aListener,PRBool aVerif */ nsresult nsParser::Parse(nsIInputStream& aStream,PRBool aVerifyEnabled, void* aKey,eParseMode aMode){ NS_START_STOPWATCH(mTotalTime) + mDTDVerification=aVerifyEnabled; nsresult result=NS_ERROR_OUT_OF_MEMORY; @@ -902,6 +910,9 @@ nsresult nsParser::ParseFragment(const nsString& aSourceBuffer,void* aKey,nsITag nsresult nsParser::ResumeParse(nsIDTD* aDefaultDTD, PRBool aIsFinalChunk) { nsresult result=NS_OK; if(mParserContext->mParserEnabled && mInternalState!=NS_ERROR_HTMLPARSER_STOPPARSING) { + + NS_START_STOPWATCH(mParseTime) + result=WillBuildModel(mParserContext->mScanner->GetFilename(),aDefaultDTD); if(mParserContext->mDTD) { mParserContext->mDTD->WillResumeParse(); @@ -915,10 +926,18 @@ nsresult nsParser::ResumeParse(nsIDTD* aDefaultDTD, PRBool aIsFinalChunk) { ((eOnStop==mParserContext->mStreamListenerState) && (NS_OK==result))){ DidBuildModel(mStreamStatus); NS_STOP_STOPWATCH(mTotalTime); + NS_STOP_STOPWATCH(mParseTime); + + #ifdef RAPTOR_PERF_METRICS printf("Total Time: "); mTotalTime.Print(); printf("\n"); + + printf("Parse Time: "); + mParseTime.Print(); + printf("\n"); + #endif return mInternalState; } @@ -939,6 +958,8 @@ nsresult nsParser::ResumeParse(nsIDTD* aDefaultDTD, PRBool aIsFinalChunk) { } }//if + NS_STOP_STOPWATCH(mParseTime); + return result; } @@ -1288,7 +1309,7 @@ nsresult nsParser::OnDataAvailable(nsIURI* aURL, nsIInputStream *pIStream, PRUin printf("xmlencoding detect- %s\n", guess.ToNewCString()); #endif this->SetDocumentCharset(guess, guessSource); - mParserContext->mScanner->SetDocumentCharset(guess, guessSource); + mParserContext->mScanner->SetDocumentCharset(guess, guessSource); } } theTotalRead+=theNumRead; diff --git a/mozilla/parser/htmlparser/src/nsParser.h b/mozilla/parser/htmlparser/src/nsParser.h index 345f46056f8..1872515d1b7 100644 --- a/mozilla/parser/htmlparser/src/nsParser.h +++ b/mozilla/parser/htmlparser/src/nsParser.h @@ -381,9 +381,13 @@ protected: nsCharsetSource mCharsetSource; nsresult mInternalState; CObserverService mObserverService; + #ifdef RAPTOR_PERF_METRICS +public: Stopwatch mTotalTime; + Stopwatch mParseTime; #endif + };