From cfd3ca4fdde8fbfc711f0c18e9ef3a6be3e9b8ba Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Thu, 22 Jan 2026 16:12:35 +0100 Subject: [PATCH 01/17] Set up for phpbench --- composer.json | 3 +- phpbench-bootstrap.php | 146 +++++++++++++++++++++++++++++++++++++++++ phpbench.json | 4 ++ 3 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 phpbench-bootstrap.php create mode 100644 phpbench.json diff --git a/composer.json b/composer.json index 2c5b20f7879a9..4ef5cc6dc0688 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,8 @@ "squizlabs/php_codesniffer": "3.13.5", "wp-coding-standards/wpcs": "~3.3.0", "phpcompatibility/phpcompatibility-wp": "~2.1.3", - "yoast/phpunit-polyfills": "^1.1.0" + "yoast/phpunit-polyfills": "^1.1.0", + "phpbench/phpbench": "^1.4" }, "config": { "allow-plugins": { diff --git a/phpbench-bootstrap.php b/phpbench-bootstrap.php new file mode 100644 index 0000000000000..8417cf8d15f65 --- /dev/null +++ b/phpbench-bootstrap.php @@ -0,0 +1,146 @@ + Date: Thu, 22 Jan 2026 20:37:59 +0100 Subject: [PATCH 02/17] phpbench setup --- phpbench-bootstrap.php | 115 ++++++++--------------------------------- phpbench.json | 3 +- 2 files changed, 23 insertions(+), 95 deletions(-) diff --git a/phpbench-bootstrap.php b/phpbench-bootstrap.php index 8417cf8d15f65..a5ac836db1736 100644 --- a/phpbench-bootstrap.php +++ b/phpbench-bootstrap.php @@ -1,105 +1,52 @@ Date: Fri, 23 Jan 2026 14:10:02 +0100 Subject: [PATCH 03/17] benchmarking js escaping --- .../html-api/WpHtmlTagProcessorBench.php | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 tests/benchmarks/html-api/WpHtmlTagProcessorBench.php diff --git a/tests/benchmarks/html-api/WpHtmlTagProcessorBench.php b/tests/benchmarks/html-api/WpHtmlTagProcessorBench.php new file mode 100644 index 0000000000000..7342fe52a0737 --- /dev/null +++ b/tests/benchmarks/html-api/WpHtmlTagProcessorBench.php @@ -0,0 +1,105 @@ +set_modifiable_text( $source_text ), 'Failed to set modifiable text.' ); + } + + /** + * @return iterable + */ + public static function provide_processor(): iterable { + foreach ( self::provide_javascript() as $name => $source_text ) { + $processor = new WP_HTML_Tag_Processor( '' ); + $processor->next_tag(); + yield $name => array( $processor, $source_text ); + } + } + + /** + * Provide simple Unix-style paths. + * @return iterable + */ + public static function provide_javascript(): iterable { + yield 'empty' => ''; + + yield 'short' => 'console.log("Hello, World!");'; + + // yield 'tinymce' => file_get_contents( dirname(__DIR__, 2) . 'src/js/_enqueues/vendor/tinymce/tinymce.js' ); + + yield 'many replacements' => <<<'JS' + /* /src/wp-admin/includes/class-wp-filesystem-ftpsockets\.php /src/wp-includes/class-wp-oembed\.php @@ -329,6 +330,7 @@ /tests/phpunit/* + /tests/benchmarks/benchmarks/* From c4a0adb25da49dd9cb83c626b68e2a7b6c0ed139 Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Tue, 10 Mar 2026 17:23:09 +0100 Subject: [PATCH 11/17] improve benchmarks and isolate set up --- .../html-api/WpHtmlTagProcessorBench.php | 92 ++++++++++++------- 1 file changed, 58 insertions(+), 34 deletions(-) diff --git a/tests/benchmarks/benchmarks/html-api/WpHtmlTagProcessorBench.php b/tests/benchmarks/benchmarks/html-api/WpHtmlTagProcessorBench.php index 7c774a5a3623a..e70c4a2c83819 100644 --- a/tests/benchmarks/benchmarks/html-api/WpHtmlTagProcessorBench.php +++ b/tests/benchmarks/benchmarks/html-api/WpHtmlTagProcessorBench.php @@ -9,44 +9,43 @@ use PhpBench\Attributes as Bench; -#[Bench\Warmup( 3 )] -#[Bench\Iterations( 10 )] -#[Bench\Revs( 100 )] class WpHtmlTagProcessorBench { + private $processor = null; + + public function clean_up_processor(): void { + $this->processor = null; + } /** * Benchmark normalizing simple Unix paths. - * @param array{0: WP_HTML_Tag_Processor, 1: string} $params + * @param array{0: string} $params */ - #[Bench\ParamProviders( 'provide_script_tag_processor' )] + #[Bench\Warmup( 2 )] + #[Bench\Iterations( 10 )] + #[Bench\Revs( 50 )] + #[Bench\BeforeMethods( 'set_up_script_tag_processor' )] + #[Bench\AfterMethods( 'clean_up_processor' )] + #[Bench\ParamProviders( 'provide_script_tag_contents' )] public function bench_javascript_custom_escape( array $params ): void { - [$processor, $source_text] = $params; - assert( $processor->set_modifiable_text( $source_text ), 'Failed to set modifiable text.' ); + [ $source_text] = $params; + assert( $this->processor->set_modifiable_text( $source_text ), 'Failed to set modifiable text.' ); } - /** - * @return iterable - */ - public static function provide_script_tag_processor(): iterable { - foreach ( self::provide_javascript() as $name => $source_text ) { - $processor = new WP_HTML_Tag_Processor( '' ); - $processor->next_tag(); - yield $name => array( $processor, $source_text ); - } + public function set_up_script_tag_processor(): void { + $this->processor = new WP_HTML_Tag_Processor( '' ); + $this->processor->next_tag(); } /** - * Provide simple Unix-style paths. - * @return iterable + * @return iterable */ - public static function provide_javascript(): iterable { - yield 'empty' => ''; - - yield 'short' => 'console.log("Hello, World!");'; + public static function provide_script_tag_contents(): iterable { + yield 'empty' => array( '' ); - // yield 'tinymce' => file_get_contents( dirname(__DIR__, 2) . 'src/js/_enqueues/vendor/tinymce/tinymce.js' ); + yield 'short' => array( 'console.log("Hello, World!");' ); - yield 'many replacements' => <<<'JS' + yield 'many replacements' => array( + <<<'JS' /*