PHP: comprendre comment fonctionne la prédication de la twig

Après avoir lu la prédication de twig , j'ai essayé de comprendre comment cela fonctionne.

J'ai écrit un test de base (ci-dessous).

Je pense que, après la première boucle, php sait comment le tableau est structuré et prédit le résultat de la condition ($items[$i] <= 150000) , mais l'heure de la seconde boucle est la même que la première boucle et elle ne semble pas bénéficier de la prédication de twig.

Quelques questions:

  1. Peut-être que php ne prend pas en charge la prédication de twig?
  2. Peut-être que je n'ai pas compris la prédication des twigs?
  3. Mon test est faux / a-t-il d'autres problèmes de performance?

Mon test:

 $count = 300000; $items = array(); $found = 0; // build array for ($i = 0; $i <= $count; $i++) { array_push($items, rand(0, $i)); } // first loop with no predication benefit // ------------------------------------ $time_start = microtime(true); for($i = 0; $i <= $count; $i++) { $found = ($items[$i] <= 150000) ? $found+1 : $found; } $time_end = microtime(true); $time = $time_end - $time_start; // ------------------------------------ echo "first loop\r\n"; echo 'Found:'. $found . "\r\n"; echo 'End:' . $time . "\r\n"; // reset counter $found = 0; // second loop with predication benefit // ------------------------------------ $time_start = microtime(true); for($i = 0; $i <= $count; $i++) { $found = ($items[$i] <= 150000) ? $found+1 : $found; } $time_end = microtime(true); $time = $time_end - $time_start; // ------------------------------------ echo "second loop\r\n"; echo 'Found:'. $found . "\r\n"; echo 'End:' . $time . "\r\n"; 

sortie

 first loop Found:254052 End:0.093052864074707 second loop Found:254052 End:0.092923879623413 

http://codepad.org/Zni0b5rS

TL; TR

La prédiction de twig est une caractéristique matérielle .


Le langage de programmation qui bénéficie des caractéristiques matérielles est C dans ce cas. (PHP est écrit en C). Ou bien dit, le code machine compilé à partir des sources C de PHP. Donc, oui, vous bénéficiez déjà de la prédiction de la twig, mais pas comme vous le pensez.

Le bénéfice de la prédiction de la twig se produit à un niveau beaucoup plus bas. Fondamentalement, vous devez savoir que les commands machine (!) Suivantes sont chargées dans le pipeline de la CPU avant d'être exécutées. Mais le chargement des commands prend du time.

S'il existe une command de saut conditionnel à exécuter, les commands subséquentes dans le pipeline pourraient ne plus être mises à jour si la condition est jugée vraie, puisque les commands de saut indiquent à la CPU de continuer à charger des commands à partir d'un location différent dans le code (machine (!)) – la cible de saut – dans ce cas.

Cela signifie que la CPU doit rincer le pipeline existant et le remplir avec des commands commençant par l'location de la cible de saut. Si à l'endroit où il y a une autre cible, la même chose se reproduirait. Notez que les sauts conditionnels sont l'une des commands de machines les plus vues.

Cela dit, la performance de la command line ne serait pas suffisante.

Qu'en est-il de savoir si la CPU pourrait être intelligente et deviner si la condition est jugée vraie avant même qu'elle ne soit évaluée? Il pourrait charger des commands de cette cible de saut immédiatement après avoir chargé une command de saut dans la pipeline. Notez que les charges ne sont pas égales à exécuter ! Encore une fois, le processeur essaie de le deviner avant que la condition ne soit évaluée. Si la conjecture devrait être erronée, la CPU devra évidemment encore évacuer la pipeline et la remplir avec les commands correctes. Mais les chances que le rinçage n'est pas nécessaire sont meilleures que par rapport à ne pas le deviner.

Il existe plusieurs algorithms qui implémentent la conjecture, des approches statiques à dynamics qui tiennent count de ce que le code a fait jusqu'à présent. Ils sont assez sophistiqués et atteignent des taux de réussite incroyablement élevés. Consultez Wikipedia, les algorithms sont expliqués là-bas:

https://en.wikipedia.org/wiki/Branch_predictor


Retour à votre code PHP; Même la première boucle pourrait probablement bénéficier de la prédiction de twig.

Oui, il est évident que les deux loops font de même et ne doivent donc être exécutées qu'une seule fois. Cependant, PHP comme langage de programmation interprété est un niveau trop élevé pour parsingr ces fonctionnalités matérielles car trop de choses se produisent dans les coulisses. (Probablement même un changement de tâche entre les loops).

Bien que, si vous aviez écrit un code comparable en C, le compilateur C aurait probablement opté pour cela. gcc par exemple peut détecter beaucoup de telles situations. (Incroyable!) Cependant, cela se produirait déjà au moment de la compilation, même avant le time d'exécution.


Si vous souhaitez parsingr la prédiction de twig, l'utilisation du langage Assembler et le débogueur GDB peuvent l'afficher en pratique.