From: Tim Düsterhus Date: Thu, 25 Jun 2015 20:34:01 +0000 (+0200) Subject: Improve performance of ObjectTypeCache::init() X-Git-Tag: 3.0.0_Beta_1~2244^2~3 X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=597c1bbc44291dea25931b427508925a3ec6cc73;p=GitHub%2FWoltLab%2FWCF.git Improve performance of ObjectTypeCache::init() This method was one of the slowest that get’s regularly called during a request. According to XDebug profiler a request in an empty, stock setup of Burning Board spent 7% of it's time in this method when requesting ?board-list/. 14% if you are including methods called by this method. While that obviously does not represent a real world community optimizing this method is sound, as it’s easily done: After moving the θ(n) calculation that groups object types by their definition into the cache where it belongs the numbers go down to 0.31% (excl) and 1.80% (incl). --- diff --git a/wcfsetup/install/files/lib/data/object/type/ObjectTypeCache.class.php b/wcfsetup/install/files/lib/data/object/type/ObjectTypeCache.class.php index 928c9e5c55..1dbeb1aa56 100644 --- a/wcfsetup/install/files/lib/data/object/type/ObjectTypeCache.class.php +++ b/wcfsetup/install/files/lib/data/object/type/ObjectTypeCache.class.php @@ -57,14 +57,7 @@ class ObjectTypeCache extends SingletonFactory { // get object type cache $this->objectTypes = ObjectTypeCacheBuilder::getInstance()->getData(array(), 'objectTypes'); - foreach ($this->objectTypes as $objectType) { - $definition = $this->getDefinition($objectType->definitionID); - if (!isset($this->groupedObjectTypes[$definition->definitionName])) { - $this->groupedObjectTypes[$definition->definitionName] = array(); - } - - $this->groupedObjectTypes[$definition->definitionName][$objectType->objectType] = $objectType; - } + $this->groupedObjectTypes = ObjectTypeCacheBuilder::getInstance()->getData(array(), 'groupedObjectTypes'); } /** diff --git a/wcfsetup/install/files/lib/system/cache/builder/ObjectTypeCacheBuilder.class.php b/wcfsetup/install/files/lib/system/cache/builder/ObjectTypeCacheBuilder.class.php index e6ef706360..45e97a3b72 100644 --- a/wcfsetup/install/files/lib/system/cache/builder/ObjectTypeCacheBuilder.class.php +++ b/wcfsetup/install/files/lib/system/cache/builder/ObjectTypeCacheBuilder.class.php @@ -22,7 +22,8 @@ class ObjectTypeCacheBuilder extends AbstractCacheBuilder { $data = array( 'categories' => array(), 'definitions' => array(), - 'objectTypes' => array() + 'objectTypes' => array(), + 'groupedObjectTypes' => array() ); // get definitions @@ -48,7 +49,11 @@ class ObjectTypeCacheBuilder extends AbstractCacheBuilder { $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(); while ($row = $statement->fetchArray()) { - $data['objectTypes'][$row['objectTypeID']] = new ObjectType(null, $row); + $data['objectTypes'][$row['objectTypeID']] = $objectType = new ObjectType(null, $row); + + $definition = $data['definitions'][$objectType->definitionID]; + if (!isset($data['groupedObjectTypes'][$definition->definitionName])) $data['groupedObjectTypes'][$definition->definitionName] = array(); + $data['groupedObjectTypes'][$definition->definitionName][$objectType->objectType] = $objectType; } return $data;