diff --git a/CHANGELOG.md b/CHANGELOG.md index f9b86a6..7d93bf5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ * perf: Remove type guesser from `TypeResolver`. * perf(`ObjectCache`): Optimize using plain arrays. * perf: Optimize `ObjectCache` & `Context`. +* perf(`TransformerRegistry`): Cache `TransformerInterface` instances. ## 0.5.14 diff --git a/src/TransformerRegistry/CachingTransformerRegistry.php b/src/TransformerRegistry/CachingTransformerRegistry.php index 99c0bf5..498ece8 100644 --- a/src/TransformerRegistry/CachingTransformerRegistry.php +++ b/src/TransformerRegistry/CachingTransformerRegistry.php @@ -29,9 +29,18 @@ public function __construct( ) { } + /** + * @var array + */ + private array $transformers = []; + public function get(string $id): TransformerInterface { - return $this->decorated->get($id); + if (isset($this->transformers[$id])) { + return $this->transformers[$id]; + } + + return $this->transformers[$id] = $this->decorated->get($id); } public function findBySourceAndTargetTypes( diff --git a/src/TransformerRegistry/TransformerRegistry.php b/src/TransformerRegistry/TransformerRegistry.php index b522475..4495b94 100644 --- a/src/TransformerRegistry/TransformerRegistry.php +++ b/src/TransformerRegistry/TransformerRegistry.php @@ -32,8 +32,17 @@ public function __construct( ) { } + /** + * @var array + */ + private array $transformers = []; + public function get(string $id): TransformerInterface { + if (isset($this->transformers[$id])) { + return $this->transformers[$id]; + } + $transformer = $this->transformersLocator->get($id); if (!$transformer instanceof TransformerInterface) { @@ -44,7 +53,7 @@ public function get(string $id): TransformerInterface )); } - return $transformer; + return $this->transformers[$id] = $transformer; } /**