wiki.techinc.nl/maintenance/benchmarks/benchmarkCommentFormatter.php
Tim Starling f7f84dddb3 Introduce CommentFormatter
CommentParser:

* Move comment formatting backend from Linker to a CommentParser service.
  Allow link existence and file existence to be batched.
* Rename $local to $samePage since I think that is clearer.
* Rename $title to $selfLinkTarget since it was unclear what the title
  was used for.
* Rename the "autocomment" concept to "section link" in public
  interfaces, although the old term remains in CSS classes.
* Keep unsafe HTML pass-through in separate "unsafe" methods, for easier
  static analysis and code review.

CommentFormatter:

* Add CommentFormatter and RowCommentFormatter services as a usable
  frontend for comment batches, and to replace the Linker static methods.
* Provide fluent and parametric interfaces.

Linker:

* Remove Linker::makeCommentLink() without deprecation -- nothing calls
  it and it is obviously an internal helper.
* Soft-deprecate Linker methods formatComment(), formatLinksInComment(),
  commentBlock() and revComment().

Caller migration:

* CommentFormatter single: Linker, RollbackAction, ApiComparePages,
  ApiParse
* CommentFormatter parametric batch: ImageHistoryPseudoPager
* CommentFormatter fluent batch: ApiQueryFilearchive
* RowCommentFormatter sequential: History feed, BlocklistPager,
  ProtectedPagesPager, ApiQueryProtectedTitles
* RowCommentFormatter with index: ChangesFeed, ChangesList,
  ApiQueryDeletedrevs, ApiQueryLogEvents, ApiQueryRecentChanges
* RevisionCommentBatch: HistoryPager, ContribsPager

Bug: T285917
Change-Id: Ia3fd50a4a13138ba5003d884962da24746d562d0
2021-09-28 11:13:03 -07:00

78 lines
2.1 KiB
PHP

<?php
use MediaWiki\CommentFormatter\CommentItem;
use MediaWiki\MediaWikiServices;
require_once __DIR__ . '/../includes/Benchmarker.php';
class BenchmarkCommentFormatter extends Benchmarker {
public function __construct() {
parent::__construct();
$this->addDescription( 'Benchmark Linker::formatComment()' );
$this->addOption( 'file', 'A JSON API result from list=recentchanges',
false, true );
}
public function execute() {
$file = $this->getOption( 'file',
__DIR__ . '/data/CommentFormatter/rc100-2021-07-29.json' );
$json = file_get_contents( $file );
if ( !$json ) {
$this->fatalError( "Unable to read input file \"$file\"" );
}
$result = json_decode( $json, true );
if ( !isset( $result['query']['recentchanges'] ) ) {
$this->fatalError( "Invalid JSON data" );
}
$entries = $result['query']['recentchanges'];
$inputs = [];
$comments = [];
foreach ( $entries as $entry ) {
$inputs[] = [
'comment' => $entry['comment'],
'title' => Title::newFromText( $entry['title'] )
];
$comments[] = $entry['comment'];
}
$this->bench( [
'Linker::formatComment' => [
'function' => static function () use ( $inputs ) {
Title::clearCaches();
foreach ( $inputs as $input ) {
Linker::formatComment(
$input['comment'],
$input['title']
);
}
},
],
'CommentFormatter::createBatch' => [
'function' => static function () use ( $inputs ) {
Title::clearCaches();
$formatter = MediaWikiServices::getInstance()->getCommentFormatter();
$comments = [];
foreach ( $inputs as $input ) {
$comments[] = ( new CommentItem( $input['comment'] ) )
->selfLinkTarget( $input['title'] );
}
$formatter->createBatch()
->comments( $comments )
->execute();
}
],
'CommentFormatter::formatStrings' => [
'function' => static function () use ( $comments ) {
Title::clearCaches();
$formatter = MediaWikiServices::getInstance()->getCommentFormatter();
$formatter->formatStrings( $comments );
}
],
] );
}
}
$maintClass = BenchmarkCommentFormatter::class;
require_once RUN_MAINTENANCE_IF_MAIN;