diff -u b/core/lib/Drupal/Core/Plugin/Discovery/CacheDecorator.php b/core/lib/Drupal/Core/Plugin/Discovery/CacheDecorator.php --- b/core/lib/Drupal/Core/Plugin/Discovery/CacheDecorator.php +++ b/core/lib/Drupal/Core/Plugin/Discovery/CacheDecorator.php @@ -65,14 +65,21 @@ * Implements Drupal\Component\Plugin\Discovery\DicoveryInterface::getDefinition(). */ public function getDefinition($plugin_id) { - if (isset($this->definitions[$plugin_id])) { - return $this->definitions[$plugin_id]; + // Optimize for fast access to definitions if they are already in memory. + if (isset($this->definitions)) { + // Avoid using a ternary that would create a copy of the array. + if (isset($this->definitions[$plugin_id])) { + return $this->definitions[$plugin_id]; + } + else { + return; + } } - if (!isset($this->definitions) && $definitions = $this->getDefinitions()) { - if (isset($definitions[$plugin_id])) { - return $definitions[$plugin_id]; - } + $definitions = $this->getDefinitions(); + // Avoid using a ternary that would create a copy of the array. + if (isset($definitions[$plugin_id])) { + return $definitions[$plugin_id]; } } @@ -80,6 +87,7 @@ * Implements Drupal\Component\Plugin\Discovery\DicoveryInterface::getDefinitions(). */ public function getDefinitions() { + // Optimize for fast access to definitions if they are already in memory. if (isset($this->definitions)) { return $this->definitions; }