Reuse the `\IntlDateFormatter`
authorAlexander Ebert <ebert@woltlab.com>
Mon, 15 Apr 2024 13:35:47 +0000 (15:35 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Sat, 8 Jun 2024 10:31:07 +0000 (12:31 +0200)
Constructing the object every time is a rather expensive process.

The test for a page with 96 calls to the `|time` modifier showed an average of 8ms spent inside the `execute()` method.

The optimized version showed a consistent runtime of around 1.3ms.

wcfsetup/install/files/lib/system/template/plugin/TimeModifierTemplatePlugin.class.php

index ee8597d1f6671ac709ddee3ad84826c1e395ba7f..cb59f8d35fef104fde5109006f6fead3b50c4045 100644 (file)
@@ -20,6 +20,9 @@ use wcf\system\WCF;
  */
 class TimeModifierTemplatePlugin implements IModifierTemplatePlugin
 {
+    /** @var array<string, \IntlDateFormatter> */
+    private array $dateFormatter = [];
+
     /**
      * @inheritDoc
      */
@@ -34,12 +37,23 @@ class TimeModifierTemplatePlugin implements IModifierTemplatePlugin
 
         $isFutureDate = $dateTime->getTimestamp() > TIME_NOW;
 
-        $dateAndTime = \IntlDateFormatter::create(
-            WCF::getLanguage()->getLocale(),
-            \IntlDateFormatter::LONG,
-            \IntlDateFormatter::SHORT,
-            WCF::getUser()->getTimeZone()
-        )->format($dateTime);
+        $locale = WCF::getLanguage()->getLocale();
+        $timeZone = WCF::getUser()->getTimeZone();
+
+        $key = $locale . '::' . $timeZone->getName();
+        $dateFormatter = $this->dateFormatter[$key] ?? null;
+        if ($dateFormatter === null) {
+            $dateFormatter = \IntlDateFormatter::create(
+                WCF::getLanguage()->getLocale(),
+                \IntlDateFormatter::LONG,
+                \IntlDateFormatter::SHORT,
+                WCF::getUser()->getTimeZone()
+            );
+
+            $this->dateFormatter[$key] = $dateFormatter;
+        }
+
+        $dateAndTime = $dateFormatter->format($dateTime);
 
         return \sprintf(
             '<woltlab-core-date-time date="%s"%s>%s</woltlab-core-date-time>',