diff --git a/CHANGELOG.md b/CHANGELOG.md index f472158d..b97922af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 2.2.1 under development +- Enh #132: Add benchmarks, improve performance of `Message::parse()` (@samdark) - Bug #130: Updated `Message::parse()` to correctly support multiple placeholders (@technicated) - Chg #130, #133: Changed `Message::parse()` to conform to PSR-3 (@technicated, @vjik) diff --git a/composer.json b/composer.json index a374d16a..4c7f7123 100644 --- a/composer.json +++ b/composer.json @@ -36,6 +36,7 @@ }, "require-dev": { "maglnet/composer-require-checker": "^4.4", + "phpbench/phpbench": "^1.0", "phpunit/phpunit": "^9.6.23", "rector/rector": "^2.0.17", "roave/infection-static-analysis-plugin": "^1.25", @@ -82,6 +83,7 @@ }, "scripts": { "test": "phpunit --testdox --no-interaction", - "test-watch": "phpunit-watcher watch" + "test-watch": "phpunit-watcher watch", + "bench": "phpbench run --report=default" } } diff --git a/phpbench.json b/phpbench.json new file mode 100644 index 00000000..447d3202 --- /dev/null +++ b/phpbench.json @@ -0,0 +1,7 @@ +{ + "runner.bootstrap": "vendor/autoload.php", + "runner.path": "tests/Benchmark", + "runner.revs": 1000, + "runner.iterations": 10, + "runner.retry_threshold": 2 +} diff --git a/src/Message.php b/src/Message.php index 0985e702..c47fbebc 100644 --- a/src/Message.php +++ b/src/Message.php @@ -206,6 +206,10 @@ private function parse(string|Stringable $message, array $context): string { $message = (string) $message; + if (!str_contains($message, '{')) { + return $message; + } + /** @var string */ return preg_replace_callback( '/\{([\w\.\\\\_]+)\}/', diff --git a/tests/Benchmark/LoggerBench.php b/tests/Benchmark/LoggerBench.php new file mode 100644 index 00000000..6e0f284f --- /dev/null +++ b/tests/Benchmark/LoggerBench.php @@ -0,0 +1,43 @@ +logger = new Logger([new class () extends Target { + protected function export(): void + { + // noop + } + }]); + } + + public function benchLogSimple(): void + { + $this->logger->log(LogLevel::INFO, 'simple message'); + } + + public function benchLogWithPlaceholder(): void + { + $this->logger->log(LogLevel::INFO, 'has {foo} placeholder', ['foo' => 'some']); + } + + public function benchLogWithMultiplePlaceholders(): void + { + $this->logger->log( + LogLevel::INFO, + 'Placeholder 1: {p1} - Placeholder 2: {p2}', + ['p1' => 'hello', 'p2' => 'world'], + ); + } +} diff --git a/tests/Benchmark/MessageBench.php b/tests/Benchmark/MessageBench.php new file mode 100644 index 00000000..24b5a878 --- /dev/null +++ b/tests/Benchmark/MessageBench.php @@ -0,0 +1,55 @@ + 'some']); + } + + public function benchSinglePlaceholderScalar(): void + { + new Message(LogLevel::INFO, 'has {foo} placeholder', ['foo' => 'some']); + } + + public function benchPlaceholderMissing(): void + { + new Message(LogLevel::INFO, 'has {foo} placeholder', []); + } + + public function benchPlaceholderNull(): void + { + new Message(LogLevel::INFO, 'has "{foo}" placeholder', ['foo' => null]); + } + + public function benchPlaceholderArray(): void + { + new Message(LogLevel::INFO, 'has "{foo}" placeholder', ['foo' => ['bar' => 7]]); + } + + public function benchNestedPlaceholder(): void + { + new Message(LogLevel::INFO, 'has "{foo.bar}" placeholder', ['foo' => ['bar' => 7]]); + } + + public function benchDeeplyNestedPlaceholder(): void + { + new Message(LogLevel::INFO, 'has "{foo.bar.baz}" placeholder', ['foo' => ['bar' => ['baz' => 7]]]); + } + + public function benchMultiplePlaceholders(): void + { + new Message( + LogLevel::INFO, + 'Placeholder 1: {p1} - Placeholder 2: {p2}', + ['p1' => 'hello', 'p2' => 'world'], + ); + } +}