Études-compute/Quoi partager avec Sharer ?

From Lazi wiki
Jump to: navigation, search

Question

Limiter Sharer aux apply semble une optimisation car pour les autres il n'y a pas de calcul à partager ou alors il y a déjà un partageur (pour les constantes globales). Mais quand on limite on perd 30% de temps de calcul! Je ne comprend pas pourquoi ?

Étude

Ce n'est pas le code supplémentaire pour le test qui pause problème car celui-ci ne prend que 5% de temps en plus.

Commande:

CMD="lazi-compute -c /tmp/lazi-tmp-9O3qIAK_/commands-lazi.xml -d /tmp/lazi-tmp-9O3qIAK_/definitions.xml -o /tmp/lazi-tmp-9O3qIAK_/compute-output.xml"
NBR=20
MIN=10000000
while [ $NBR -gt 0 ]; do NBR=$((NBR-1));
t=$(command time --format=%U $CMD 2>&1)
resTest=$(echo "$t<$MIN" |bc -l)
if [ $resTest  -eq 1 ]; then MIN=$t; fi
done
echo ${MIN}s

En mettant dans Sharer :

  • les Apply  : 0.29s
  • les Apply et les Function : 0.22s
  • rien : >90s
  • En mettant les Function : >30s
  • tout sauf les Sharer : 0.22s
  • tout : 0.21s

Donc les fonctions dans sharer réduisent le temps de calcul alors qu'elles ne sont pas calculées seules.

Donc il semble que les Functions sont pratiquement les seules avec Apply à diminuer le temps d'éxécution.

C'est parce qu'une autre fonction des sharer est de marquer qu'il n'y a pas de variables à l'intérieure de la formule, et donc cela va plus vite lors du remplacement.

Sharer d'une fonction et remplacement

Question

Si une fonction est dans un sharer, et que l'on applique la fonction à une valeur, peut-on distribuer des infos du sharer ? Faudrait-il créer une classe pour signifier "pas de variable dedans" ?

Étude

Le corps de la fonction ne contient qu'un seul nom de variable, car la fonction est dans un sharer. Quand on calcul l'application d'un argument à une fonction l'argument ne contient pas de variable. Donc le résultat du remplacement sera sans variable. Les parties du corps qui n'ont pas subit de remplacement pourrait être partagé avec l'autre sharer. Mais pour cela le plus simple serait de créer de multiples sharer avant même le remplacement.

Peut-on, à la création des formules, lors de la lecture xml, créer les sharers ? Peut-on aussi, créer une classe "NoVar" et englober, dans le corps des fonctions, toutes les sous parties "Apply" qui ne contiennent pas de variable ? Ou alors ajouter un flag "no_var" à Apply ?

Mais Il n'y a des remplacements que dans le corps des fonctions, et ce qui pose problème est que le corps peut être gros à cause des remplacements antérieurs. Mais les variables sont toujours remplacées par des formules sans variables. Donc il suffit d'utiliser tout le temps un sharer pour les arguments ayant une grande profondeur et remplaçables, c'est à dire les apply et les fonctions. On peut peut-être accélérer un peu en créant une classe parent de Sharer: NoVar, qui ne ferait pas le calcul interne et serait utilisé quand l'argument est une fonction.

Peut-on créer les Sharer et les NoVar uniquement à la lecture du XML ?

Si on met un Sharer ou un NoVar (quand l'argument est une fonction) à chaque argument d'une fonction ? Dans ce cas un Sharer pourrait contenir une variable, et on ne pourrait plus l'utiliser correctement.

Réponse

Question 1: non, voir étude

Question 2: oui, peut-être rentable.

Il faut créer le Sharer au moment de l'application de l'argument, et éventuellement utiliser une classe NoVar pour éviter la tentative de calcul inutile sur les fonctions. Le Sharer doit contenir un Apply, le NoVar une fonction.

Réponse

Parce qu'une autre fonction du Sharer est d'indiquer qu'il n'y a pas de variable à l'intérieur, ce qui gagne du temps pour les formules complexes pouvant en contenir: Apply et Function.

Il faut créer le Sharer au moment de l'application de l'argument, faire créer le Sharer par les classes en utilisant les fonctions virtuelles, ce qui permet de mettre computed à false pour Function.

Gain : 10%.