Cache the list of source and block BBCodes
authorAlexander Ebert <ebert@woltlab.com>
Thu, 11 Apr 2024 13:35:07 +0000 (15:35 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Sat, 8 Jun 2024 10:31:07 +0000 (12:31 +0200)
These methods exist in the hot path for the BBCode processing and are called often, but are known to have a static result at runtime.

Caching the result shows latency improvements of up to 3%.

wcfsetup/install/files/lib/system/bbcode/BBCodeParser.class.php

index fabe20c14b4cd3adaf8394f84485b3198a22f533..cf8af0913e27a5abae1257c4f643230e3f7e0629 100644 (file)
@@ -600,10 +600,15 @@ class BBCodeParser extends SingletonFactory
      */
     public function getBlockBBCodes(): array
     {
-        $bbcodes = [];
-        foreach ($this->bbcodes as $name => $bbcode) {
-            if ($bbcode->isBlockElement) {
-                $bbcodes[] = $name;
+        static $bbcodes;
+
+        if ($bbcodes === null) {
+            $bbcodes = [];
+
+            foreach ($this->bbcodes as $name => $bbcode) {
+                if ($bbcode->isBlockElement) {
+                    $bbcodes[] = $name;
+                }
             }
         }
 
@@ -617,10 +622,15 @@ class BBCodeParser extends SingletonFactory
      */
     public function getSourceBBCodes(): array
     {
-        $bbcodes = [];
-        foreach ($this->bbcodes as $name => $bbcode) {
-            if ($bbcode->isSourceCode) {
-                $bbcodes[] = $name;
+        static $bbcodes;
+
+        if ($bbcodes === null) {
+            $bbcodes = [];
+
+            foreach ($this->bbcodes as $name => $bbcode) {
+                if ($bbcode->isSourceCode) {
+                    $bbcodes[] = $name;
+                }
             }
         }