From 8035a00e8cf2bd3db6e8dbe0710cd3816a00c97a Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Tue, 18 Jun 2019 18:26:06 +0100 Subject: AutoLoader: Skip tokenizing of irrelevant lines in ClassCollector This makes AutoLoaderStructureTest in PHPUnit and the generateLocalAutoload.php maintenance script much faster. On my machine, it made it 35X faster (or time spent reduced by 97%). Bug: T225730 Change-Id: Ife959bd17ce9c2ae952dfbd158ddb3d8475e8cb2 --- includes/utils/ClassCollector.php | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'includes/utils/ClassCollector.php') diff --git a/includes/utils/ClassCollector.php b/includes/utils/ClassCollector.php index c987354d3737..12b8a707bd6f 100644 --- a/includes/utils/ClassCollector.php +++ b/includes/utils/ClassCollector.php @@ -59,6 +59,31 @@ class ClassCollector { $this->alias = null; $this->tokens = []; + // HACK: The PHP tokenizer is slow (T225730). + // Speed it up by reducing the input to the three kinds of statement we care about: + // - namespace X; + // - [final] [abstract] class X … {} + // - class_alias( … ); + $lines = []; + $matches = null; + preg_match_all( + // phpcs:ignore Generic.Files.LineLength.TooLong + '#^\t*(?:namespace |(final )?(abstract )?(class|interface|trait) |class_alias\()[^;{]+[;{]\s*\}?#m', + $code, + $matches + ); + if ( isset( $matches[0][0] ) ) { + foreach ( $matches[0] as $match ) { + $match = trim( $match ); + if ( substr( $match, -1 ) === '{' ) { + // Keep it balanced + $match .= '}'; + } + $lines[] = $match; + } + } + $code = 'startToken === null ) { $this->tryBeginExpect( $token ); -- cgit v1.2.3