1194Fermer1196
BrunniLe 30/11/2016 à 04:29
Notre appli devient super lente après un moment (je me suis retrouvé parachuté au milieu du projet qui doit genre sortir dans 2 semaines et qui est une merde infâme) et j'ai la tâche de trouver pourquoi.

Impossible à déboguer, à profiler ou quoi que ce soit (enchevêtrement de projets mélangeant C#, C++ et Javascript, qui doivent être buildés selon un ordre bien précis qui prend bien une minute pour chaque petit changement genre ajouter un log), mais je suis tombé sur une perle quand on y pense. En fait c'est assez incroyable parce que les gens qui ont bossé dessus semblent être des bons, mais voilà : chaque événement survenant sur l'UI en C# est propagé en Javascript (les "apps" sont en Javascript), et pour rendre ça asynchrone ils font un Task.Run. Alors bon ça marche tant qu'il n'y en a pas trop (genre j'imagine qu'au début du projet c'était trop 不思議 de transmettre des événements au Javascript et il y en avait 2~3), mais apparemment à un moment le thread pool est plein donc il attend que d'autres tâches asynchrones aient fini : ça peut être un transfert HTTP ou un événement de l'UI, effectivement bloquant certaines parties de l'UI pour des fois 20 secondes.

Va falloir refactorer ça sans absolument moyen de déboguer et avec plein de Task.Run partout dans les projets que j'ai même pas fini d'énumérer............. à moins d'un mois de la release. J'ai aussi un super hack, je peux mettre MONO_THREADS_PER_CPU à 1000 et notre appli redevient rapide*. Hmmmmm que vais-je faire ? grin

* (enfin c'est pas vrai elle consomme une pétée de CPU et fait descendre l'autonomie de ma Surface Pro à 1h30, pas sûr qu'on veuille ça dans le produit final. De toute façon y a pas de "bonne" solution, il y a des trucs qui restent en arrière-plan et qui bouffent beaucoup trop de CPU et il faudrait les éliminer mais sans debug mamma mia.)