Hallo Jonny 5,
danke für den Benchmark.
Meine Variante hatte vor allem ein Ziel: Das Pattern für den "Buchstaben" nur einmal in der Regex haben zu müssen. Denn je nachdem, was Du als "Buchstabe" definierst, kann das umfangreicher werden.
Nachteilig ist dabei, dass die Regex-Engine wegen des .* ins Backtracking kommt, d.h. nach jedem .* matcht sie bis zum String-Ende, merkt, dass im Pattern noch etwas kommt und setzt zurück, um zu schauen, ob sie dafür einen Match findet. Das kann man im Regex-Debugger von regex101.com gut feststellen. Dein [^a-z] verhindert das Backtracking und macht die Regexp damit schneller.
Aber das macht dann 0.3 Sekunden bei einer Million Durchläufen aus. Ja, die Laufzeit halbiert sich dadurch. Aber wir reden hier von 300ns Laufzeitdifferenz.
Man muss aufpassen, dass man sich in der Mikrooptimierung nicht verliert. Diese 300ns bezahlt Dir normalerweise niemand. Bei einer Seite wie Facebook, die zumindest früher einmal unter PHP lief (wenn auch nicht unter ZEND, sondern mit einer selbstgeschriebenen Engine), bei der diese 300ns tatsächlich eine Million mal pro Sekunden fällig werden könnten, sieht das anders aus. Da können schon minimale Unterschiede einen Unterschied von 2-3 Servern im Rechenzentrum bedeuten.
Rolf
sumpsi - posui - obstruxi