J'ai commencé à faire un
profiler pour SAM-UI. La tâche de ce
profiler est d'observer l'exécution d'une application Flash et détecter les régions chaudes du code. Celles qui pourraient demander de l'optimisation... Le tout sans modifier le code original.
Comment cibler une partie du code en particulier ? Le principe est assez simple. Au lancement de l'application, on scan de façon récursive l'objet
_global afin de cibler les différente classes et packages présents au runtime. Pour chaque classe, on scan son prototype afin de détecter les méthodes. Pour chaques méthodes, on fait un backup de la méthode l'originale, on stock le nom de classe et méthode pour cette partie de code et on exécute le backup tout en calculant le temps d'exécution.
Évidemment tout ceci ralenti l'éxécution du code mais en théorie, tout devrait rester proportionel. Donc ça permet tout de même de cibler les régions chaudes. L'utilisation que je souhaite en faire pour le moment est de :
- afficher l'historique du callstack à n'importe quel moment de l'éxécution.
- afficher des statisques dans un histogramme. Les méthodes/classes les plus lentes, rapides, utilisées, etc... En fonction du temps d'exécution minimum, maximum ou de la moyenne.
Bref mon analyse primaire me disait que c'était surement possible de le faire. J'ai donc essayer ! Les premiers tests que j'ai fait étaient uniquement sur trois classes : Main, Maman et com.Papa. Le résultat était pas si mal. L'étape suivante était de le tester avec mes packages
layout et
component qui contiennent beaucoup plus de classes. Le résultat était catastrophique !!! Vraiment très lent, mon ordi a gelé pendant une minute le temps que le Flash Player génère le XML et le renvoie à SAM-UI pour l'afficher dans un
JTree. J'avais envie de tout laisser tomber... Puis je me suis dit qu'il y avait peut-être moyen de faire un peu (beaucoup) d'optimisation !
Lire la suite