Moja aplikacja szeroko korzysta z funkcji ciągów mb_, a przejście na php 7 spowodowało ogólnie wolniejszą aplikację. Wyszukałem problemy do funkcji ciągów mb_. Oto kod odniesienia, a wyniki:Funkcje php 7 mb_ (wielobajtowe) są ~ 60% wolniejsze niż w 5.3 (tylko wydanie Windows)
$time = microtime();
$time = explode(' ', $time);
$start = $time[1] + $time[0];
$startms = $time[0];
for ($i=0; $i<100000; $i++) {
$a = mb_strlen("fdsfdssdfoifjosdifjosdifjosdij:ά", "UTF-8");
}
$time = microtime();
$time = explode(' ', $time);
$finish = $time[1] + $time[0];
$finishms = $time[0];
$total_time = round(($finish - $start), 4);
echo "mb_strlen: " . $total_time*1000 ." milliseconds<br/>";
$time = microtime();
$time = explode(' ', $time);
$start = $time[1] + $time[0];
$startms = $time[0];
for ($i=0; $i<100000; $i++) {
$a = mb_stripos("fdsfdssdfoifjosdifjosdifjosdij:ά", "α", 0, "UTF-8");
}
$time = microtime();
$time = explode(' ', $time);
$finish = $time[1] + $time[0];
$finishms = $time[0];
$total_time = round(($finish - $start), 4);
echo "mb_stripos: " . $total_time*1000 ." milliseconds<br/>";
$time = microtime();
$time = explode(' ', $time);
$start = $time[1] + $time[0];
$startms = $time[0];
for ($i=0; $i<100000; $i++) {
$a = mb_substr("fdsfdssdfoifjosdifjosdifjosdij:ά", $i, 1, "UTF-8");
}
$time = microtime();
$time = explode(' ', $time);
$finish = $time[1] + $time[0];
$finishms = $time[0];
$total_time = round(($finish - $start), 4);
echo "mb_substr: " . $total_time*1000 ." milliseconds<br/>";
Platforma Windows 7 64bit, IIS 7.5:
php 5.3.28
mb_strlen: 250 milliseconds
mb_stripos: 3078.1 milliseconds
mb_substr: 281.3 milliseconds
php 7.1.1
mb_strlen: 406.3 milliseconds
mb_stripos: 4796.9 milliseconds
mb_substr: 421.9 milliseconds
Nie wiem, czy mój zestaw się to źle czy coś, ale wydaje się nie do pomyślenia że funkcje wielobajtowe powinny działać wolniej. Wszelkie pomysły dotyczące tego, co i jak zrobić, aby rozwiązać ten problem? Z góry dziękuję.
Edycja: jak sugeruje apokryfos, może to być problem wyłącznie dla systemu Windows.
Niestety, ja po prostu nie widzę go http://sandbox.onlinephpfunctions.com/code/401f138baf7c4110f1370f8e597bba5610dd0a47 – apokryfos
@apokryfos nie wiem co OS uruchamia podany link testowy, być może jest to problem z wersją systemu Windows php – MIrrorMirror
Tylko dla czytelności: 'microtime' pobiera argument boolean, który sprawia, że zwraca już float - nie ma potrzeby" eksplodować "itd. - Myśląc o tym: To może być cały problem, czyli '$ time = explode ('', $ time); $ start = $ time [1] + $ time [0]; 'ma reprezentować? Po prostu dodajesz część msec aktualnego znacznika czasu do części sekundowej? – ccKep