Improve performance of ObjectTypeCache::init()
authorTim Düsterhus <duesterhus@woltlab.com>
Thu, 25 Jun 2015 20:34:01 +0000 (22:34 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Thu, 25 Jun 2015 20:42:46 +0000 (22:42 +0200)
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).

wcfsetup/install/files/lib/data/object/type/ObjectTypeCache.class.php
wcfsetup/install/files/lib/system/cache/builder/ObjectTypeCacheBuilder.class.php

index 928c9e5c55f4a237ab8366e4fbbed255f214b81b..1dbeb1aa56ea5903d30b6330dd5a0c0f83a18a6f 100644 (file)
@@ -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');
        }
        
        /**
index e6ef706360aec134ac2def0e45a5ab67942af35e..45e97a3b72816f75376c9dfb5b61216b503caab6 100644 (file)
@@ -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;