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.
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%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:
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
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)
Tags und Links php performance php-7 php-7.1