WordPress.org

Make WordPress Core

Opened 4 years ago

Closed 4 years ago

Last modified 4 years ago

#10971 closed defect (bug) (fixed)

Translate functions when no locale are expensive no-ops

Reported by: johanee Owned by: westi
Milestone: 2.9 Priority: normal
Severity: major Version: 2.9
Component: Performance Keywords: has-patch
Focuses: Cc:

Description (last modified by westi)

When there is no locale loaded WordPress creates a new empty Translations object on every call to any translation function (__(), ...) which is then used to do the fruitless no-op lookup.

Reverting to the 2.7 style (of testing $l10n[$domain] directly in translate() and friends) makes page load of new install of 2.9 trunk front page 17% faster!!

Attachments (4)

l10n-translation-noop-performance.patch (2.9 KB) - added by johanee 4 years ago.
Make not translating text much, much faster
l10n-translation-empty-class.patch (1.2 KB) - added by johanee 4 years ago.
Use minimal Empty_Translation object when none available
l10n-translation-noop-performance-2.patch (2.8 KB) - added by johanee 4 years ago.
Non-object approach take 2
use-noop-translations.php (502 bytes) - added by nbachiyski 4 years ago.

Download all attachments as: .zip

Change History (15)

johanee4 years ago

Make not translating text much, much faster

comment:1 westi4 years ago

Surely a much better solution to this is to store a static empty translations object and return that rather than re-introducing a lot of duplicated code.

comment:2 westi4 years ago

And by an empty translations object I mean one which just returns the strings passed to it not the base Translations class which does some extra work.

johanee4 years ago

Use minimal Empty_Translation object when none available

comment:3 johanee4 years ago

Do you mean something like the attached? It is slightly less efficient of course -- the price of abstractions -- but still much better than the current version.

comment:4 westi4 years ago

Yes something like that is much more attractive.

It makes writing plugins that use the filter much simpler as they don't have to cater for both cases.

comment:5 westi4 years ago

  • Description modified (diff)
  • Owner set to westi
  • Status changed from new to accepted

comment:6 johanee4 years ago

Good.

Regarding the filters, though: if you mean the gettext[_with_domain] filters please note that the cases there were identical as far as consumers of the filter are concerned (in the original patch).

I'll attach an updated version of the original approach that makes this more clear, just to be sure. Please select whichever approach you prefer.

If you want any modifications to any of the approaches or have any further questions please just say so.

johanee4 years ago

Non-object approach take 2

comment:7 johanee4 years ago

Performance for the various patches:

Average total page load time (ab -c 1 -n 100 http://example.org)
Clean 2.9.0 revision 12065 install

1 post front page
org: 47ms
empty-class: 42ms
noop-performance-2: 41ms

10 post front page
org: 95ms
empty-class: 87ms
noop-performance-2: 84ms

Numbers are stable.

comment:8 nbachiyski4 years ago

I like westi's idea. A lot cleaner code, than repeating the logic in each function.

I added the NOOP_Translation class to GlotPress: http://trac.glotpress.org/changeset/291

Keeping the instance if the empty translation class in the global object is both cleaner and faster. No static variables this way. Patch attached.

comment:9 westi4 years ago

Thanks nikolay.

I'll merge the whole of the updated pomo and then apply that patch.

comment:10 westi4 years ago

(In [12079]) Merge updated pomo code. Includes new NOOP_Translations class see #10971 props nbachiyski.

comment:11 westi4 years ago

  • Resolution set to fixed
  • Status changed from accepted to closed

(In [12080]) Switch to using NOOP_Translations for untranslated sites. Fixes #10971 props nbachiyski.

Note: See TracTickets for help on using tickets.