php 7 mb_ (Multibyte) Funktionen sind ~ 60% langsamer als in 5.3 (nur Windows Ausgabe)

8

Meine Anwendung nutzt mb_ string-Funktionen ausgiebig und der Wechsel zu PHP 7 führte zu einer insgesamt langsameren Anwendung. Ich habe die Probleme auf die mb_String-Funktionen aufgespürt. Hier sind der Benchmark-Code und die Ergebnisse:

%Vor%

Die Plattform ist Windows 7 64bit, IIS 7.5:

%Vor%

Ich weiß nicht, ob mein Setup falsch ist oder so, aber es scheint unvorstellbar, dass die Multibyte-Funktionen langsamer sein sollten. Irgendwelche Ideen, warum und was zu tun, um das zu lösen? Vielen Dank im Voraus.

Bearbeiten: Wie der Kommentar von apokryfos andeutet, könnte dies ein Windows-Problem sein.

    
MIrrorMirror 11.07.2017, 07:26
quelle

2 Antworten

3

Ich kann bestätigen, dass Ihr Ergebnis unter Windows 7 reproduzierbar ist. Nach einigen Experimenten fand ich eine schnelle Lösung, dass IMO nicht einmal eine Wirkung haben sollte.

Wie Sie aus mb_strlen () Funktionssignaturen sehen können, Es wird die interne Kodierung verwendet, wenn Sie den Kodierungsparameter weglassen. Dies gilt auch für andere Funktionen, die Sie verwenden.

%Vor%

Was ich seltsam fand, ist, wenn Sie die interne Kodierung auf UTF-8 setzen, indem Sie mb_internal_encoding("UTF-8") aufrufen und den Kodierungsparameter weglassen, Die Funktionen wurden schneller.

PHP 5.5 Ergebnis:

%Vor%

PHP 7.0 Ergebnis:

%Vor%

Leider ist diese schnelle Lösung nicht perfekt, da mb_stripos() und mb_strripos() nicht betroffen zu sein scheinen. Sie sind immer noch langsam.

Dies ist der Code (verkürzt):

%Vor%     
Rei 14.07.2017, 16:10
quelle
3

Das klingt wie ein "Performance Regression" Bug. sollte wahrscheinlich einen Bugreport einreichen, so dass die PHP-Core-Entwickler einen Blick darauf werfen können, unter bugs.php.net

Währenddessen sehe ich, dass du in deinen Snippets ausschließlich UTF-8 verwendest. Solange du ausschließlich UTF-8 verwendest, kannst du es mit preg_ beschleunigen, das nur eine Art von Unicode-Zeichensatz unterstützt: UTF-8 . Hier ist mein Versuch:

%Vor%

hier sind meine Benchmark-Ergebnisse auf 100.000 Iterationen auf PHP 7.0 auf Debian 9 Linux (Kernel 4.9):

mb_strlen wurde langsamer, von etwa 60 ms bis 100 ms

mb_stripos hat viel schneller, von etwa 1400ms bis 75ms

mb_substr wurde viel langsamer, von etwa 47 ms bis etwa 800 ms

  • aber ich schlage vor, dass Sie diese Tests unter Windows erneut ausführen, da Sie sagten, dass Sie denken, dass es sich um ein Windows-exklusives Problem handeln könnte

Beachten Sie auch, dass diese Funktionen nicht vollständig sind, wie Sie an den LogicExceptions sehen, die sie werfen.

Beachten Sie auch, dass aufgrund einer Einschränkung in preg_, musste ich mb_substr bei 65000 Iterationen in

%Vor%

weil, wenn Sie preg nach einer Zeichenkette suchen, die über 65.000 Zeichen lang ist, wird es einen Fehler geben ...

Beachten Sie auch, dass Ihr Benchmark-Code viel einfacher gemacht werden kann, all dies

%Vor%

kann einfach durch

ersetzt werden %Vor%

was etwas ausgibt wie: mb_strlen: 0.085 seconds (was etwa 85 Millisekunden bedeutet)

oder

%Vor%

(und ich kann eine wilde Vermutung nehmen, dass es etwas mit realloc () Performance zu tun hat, in der Linux stomps windows, aber ich habe keinen Beweis)

    
hanshenrik 14.07.2017 11:14
quelle

Tags und Links