Mon application utilise largement les fonctions mb_ chaîne et le passage à php 7 a entraîné une application globalement plus lente. J'ai repéré les problèmes dans les fonctions de chaîne mb_. Voici le code de référence et les résultats:php 7 mb_ (multi-octets) fonctions sont ~ 60% plus lent que dans 5.3 (Windows seulement question)
$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/>";
La plate-forme est Windows 7 64 bits, 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
Je ne sais pas si mon mise en place est mauvais ou quelque chose, mais il semble inconcevable que les fonctions multi-octets devraient être plus lentes. Des idées sur pourquoi et quoi faire pour résoudre cela? Merci d'avance. Edit: comme le suggère le commentaire d'apokryfos, cela peut être un problème Windows seulement.
Désolé, je ne vois pas ce http://sandbox.onlinephpfunctions.com/code/401f138baf7c4110f1370f8e597bba5610dd0a47 – apokryfos
@apokryfos Je ne sais pas quel système d'exploitation exécute le lien de test que vous avez fourni, c'est peut-être un problème avec la version Windows de php – MIrrorMirror
Juste pour la lisibilité: 'microtime' prend un argument booléen qui le fait retourner un flottant déjà - pas besoin de' explode' etc. - Penser à cela: C'est peut-être tout le problème, qu'est-ce que '$ time = explode ('', $ time); $ start = $ time [1] + $ time [0]; 'censé représenter? Vous ajoutez simplement la partie msec de l'horodatage actuel à la partie secondes? – ccKep