Hi *,

I recently investigated a performance issue with one of Wikibase's
test cases. The test in question performed a formatting task for all
known languages. While the first assertions ran as fast as expected,
they rapidly got slower until finally taking seconds per assertion. I
figured this was an actual performance bug (although hardly triggered
in production) and started profiling.

My findings, in short:

* The shims for $wgExtensionMessagesFiles as generated by
maintenance/generateJsonI18n.php register a handler for the hook
LocalisationCacheRecache when included
* For every new language loaded, all $wgExtensionMessagesFiles are
included by LocalisationCache::recache
* Afterwards, LocalisationCache::recache runs the hook LocalisationCacheRecache

This leads to the obvious issue that there is a growing number of
registered handlers, which slows down the hook, which slows down the
test.

From my point of view, this is a bug. The old approach and the current
implementation of LocalisationCache assume that
$wgExtensionMessagesFiles can be included multiple times. However, the
$wgExtensionMessagesFiles shims as generated by
maintenance/generateJsonI18n.php don't handle this case gracefully.

I can imagine two solutions:

* Fixing the caller (LocalisationCache) by making sure it does not
include a single file twice (a simple, finite cache is already
implemented in LocalisationCacheBulkLoad).
* Fixing the callees ($wgExtensionMessagesFiles) by making sure they
register the handler only once. This would need a change to all
extensions which already switched to JSON-based localisation.

What do you think?

Adrian Lang

_______________________________________________
Wikitech-l mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/wikitech-l

Reply via email to