X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fparser%2FParser.php;h=d31083649843bdb552244a008cfa6c888286f056;hp=cd804b525279c51a0d3cd870edac794dce9960d8;hb=0bfa6b6264b554d89e9ebb65e54d568d427badd4;hpb=a4b1130772122455473c47217430d0acfe5e5c26 diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index cd804b5252..d310836498 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -224,6 +224,9 @@ class Parser { */ public $mInParse = false; + /** @var SectionProfiler */ + protected $mProfiler; + /** * @param array $conf */ @@ -365,6 +368,8 @@ class Parser { $this->mPreprocessor = null; } + $this->mProfiler = new SectionProfiler(); + wfRunHooks( 'ParserClearState', array( &$this ) ); wfProfileOut( __METHOD__ ); } @@ -526,6 +531,19 @@ class Parser { $limitReport = str_replace( array( '-', '&' ), array( '‐', '&' ), $limitReport ); $text .= "\n\n"; + // Add on template profiling data + $dataByFunc = $this->mProfiler->getFunctionStats(); + uasort( $dataByFunc, function( $a, $b ) { + return $a['elapsed'] < $b['elapsed']; // descending order + } ); + $profileReport = "Top template expansion time report (%,ms,calls,template)\n"; + foreach ( array_slice( $dataByFunc, 0, 10 ) as $item ) { + $profileReport .= sprintf( "%6.2f%% %3.6f %6d - %s\n", + $item['percent'], $item['elapsed'], $item['calls'], + htmlspecialchars($item['name'] ) ); + } + $text .= "\n\n"; + if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) { wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' . $this->mTitle->getPrefixedDBkey() ); @@ -3473,7 +3491,7 @@ class Parser { $args = ( null == $piece['parts'] ) ? array() : $piece['parts']; wfProfileOut( __METHOD__ . '-setup' ); - $titleProfileIn = null; // profile templates + $profileSection = null; // profile templates # SUBST wfProfileIn( __METHOD__ . '-modifiers' ); @@ -3594,11 +3612,7 @@ class Parser { # Load from database if ( !$found && $title ) { - if ( !Profiler::instance()->isPersistent() ) { - # Too many unique items can kill profiling DBs/collectors - $titleProfileIn = __METHOD__ . "-title-" . $title->getPrefixedDBkey(); - wfProfileIn( $titleProfileIn ); // template in - } + $profileSection = $this->mProfiler->scopedProfileIn( $title->getPrefixedDBkey() ); wfProfileIn( __METHOD__ . '-loadtpl' ); if ( !$title->isExternal() ) { if ( $title->isSpecialPage() @@ -3680,8 +3694,8 @@ class Parser { # Recover the source wikitext and return it if ( !$found ) { $text = $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args ); - if ( $titleProfileIn ) { - wfProfileOut( $titleProfileIn ); // template out + if ( $profileSection ) { + $this->mProfiler->scopedProfileOut( $profileSection ); } wfProfileOut( __METHOD__ ); return array( 'object' => $text ); @@ -3707,8 +3721,8 @@ class Parser { $isLocalObj = false; } - if ( $titleProfileIn ) { - wfProfileOut( $titleProfileIn ); // template out + if ( $profileSection ) { + $this->mProfiler->scopedProfileOut( $profileSection ); } # Replace raw HTML by a placeholder