Parent5446 has uploaded a new change for review. https://gerrit.wikimedia.org/r/111400
Change subject: Code, style, and doc fixes for benchmarkParse.php ...................................................................... Code, style, and doc fixes for benchmarkParse.php Fixes database query semantics, various documentation issues, and unused variables. Change-Id: Ic2c2d4d3912a9cd6703f7690f9d08df8ea08cd5c Follows-up: I3bf3366a5ff58942 (dfd481e113f2cf5aaa) --- M maintenance/benchmarks/benchmarkParse.php 1 file changed, 57 insertions(+), 13 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core refs/changes/00/111400/1 diff --git a/maintenance/benchmarks/benchmarkParse.php b/maintenance/benchmarks/benchmarkParse.php index 79af911..158d9b6 100644 --- a/maintenance/benchmarks/benchmarkParse.php +++ b/maintenance/benchmarks/benchmarkParse.php @@ -1,11 +1,40 @@ <?php +/** + * Benchmark script for parse operations + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @author Tim Starling <[email protected]> + * @ingroup Benchmark + */ require __DIR__ . '/../Maintenance.php'; +/** + * Maintenance script to benchmark how long it takes to parse a given title at an optionally + * specified timestamp + * + * @since 1.23 + */ class BenchmarkParse extends Maintenance { /** @var string MediaWiki concatenated string timestamp (YYYYMMDDHHMMSS) */ - private $templateTimestamp; + private $templateTimestamp = null; + /** @var array Cache that maps a Title DB key to revision ID for the requested timestamp */ private $idCache = array(); function __construct() { @@ -17,22 +46,23 @@ 'Use the version of the page which was current at the given time', false, true ); $this->addOption( 'tpl-time', - 'Use templates which were current at the given time (except that moves and deletes are not handled properly)', + 'Use templates which were current at the given time (except that moves and ' . + 'deletes are not handled properly)', false, true ); } function execute() { - global $wgParser; - if ( $this->hasOption( 'tpl-time' ) ) { $this->templateTimestamp = wfTimestamp( TS_MW, strtotime( $this->getOption( 'tpl-time' ) ) ); Hooks::register( 'BeforeParserFetchTemplateAndtitle', array( $this, 'onFetchTemplate' ) ); } + $title = Title::newFromText( $this->getArg() ); if ( !$title ) { $this->error( "Invalid title" ); exit( 1 ); } + if ( $this->hasOption( 'page-time' ) ) { $pageTimestamp = wfTimestamp( TS_MW, strtotime( $this->getOption( 'page-time' ) ) ); $id = $this->getRevIdForTime( $title, $pageTimestamp ); @@ -45,13 +75,16 @@ } else { $revision = Revision::newFromTitle( $title ); } + if ( !$revision ) { $this->error( "Unable to load revision, incorrect title?" ); exit( 1 ); } + if ( !$this->hasOption( 'cold' ) ) { $this->runParser( $revision ); } + $startUsage = getrusage(); $startTime = microtime( true ); $this->runParser( $revision ); @@ -59,49 +92,60 @@ $endTime = microtime( true ); printf( "CPU time = %.3f s, wall clock time = %.3f s\n", + // CPU time $endUsage['ru_utime.tv_sec'] + $endUsage['ru_utime.tv_usec'] * 1e-6 - - $startUsage['ru_utime.tv_sec'] - $startUsage['ru_utime.tv_usec'] * 1e-6, + - $startUsage['ru_utime.tv_sec'] - $startUsage['ru_utime.tv_usec'] * 1e-6, + // Wall clock time $endTime - $startTime ); } /** + * Fetch the ID of the revision of a Title that occurred + * * @param Title $title * @param string $timestamp - * @return bool|mixed + * @return bool|string Revision ID, or false if not found or error */ - function getRevIdForTime( $title, $timestamp ) { + function getRevIdForTime( Title $title, $timestamp ) { $dbr = wfGetDB( DB_SLAVE ); + $id = $dbr->selectField( array( 'revision', 'page' ), 'rev_id', array( 'page_namespace' => $title->getNamespace(), 'page_title' => $title->getDBkey(), - 'rev_page=page_id', 'rev_timestamp <= ' . $dbr->addQuotes( $timestamp ) ), __METHOD__, - array( 'ORDER BY' => 'rev_timestamp DESC', 'LIMIT' => 1 ) ); + array( 'ORDER BY' => 'rev_timestamp DESC', 'LIMIT' => 1 ), + array( 'revision' => array( 'INNER JOIN', 'rev_page=page_id' ) ) + ); return $id; } /** + * Parse the text from a given Revision + * * @param Revision $revision */ - function runParser( $revision ) { + function runParser( Revision $revision ) { $content = $revision->getContent(); $content->getParserOutput( $revision->getTitle(), $revision->getId() ); } /** + * Hook into the parser's revision ID fetcher. Make sure that the parser only + * uses revisions around the specified timestamp. + * * @param Parser $parser * @param Title $title - * @param $skip - * @param $id + * @param bool &$skip + * @param string|bool &$id * @return bool */ - function onFetchTemplate( $parser, $title, &$skip, &$id ) { + function onFetchTemplate( Parser $parser, $title, &$skip, &$id ) { $pdbk = $title->getPrefixedDBkey(); if ( !isset( $this->idCache[$pdbk] ) ) { $proposedId = $this->getRevIdForTime( $title, $this->templateTimestamp ); -- To view, visit https://gerrit.wikimedia.org/r/111400 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic2c2d4d3912a9cd6703f7690f9d08df8ea08cd5c Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: Parent5446 <[email protected]> _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
