J'écris une application DSP en C# (essentiellement un éditeur multipiste). Je l'ai profilé depuis un certain temps sur des machines différentes et j'ai remarqué des choses «curieuses».Forcer le compilateur .NET JIT à générer le code le plus optimisé lors du démarrage de l'application
Sur mon ordinateur personnel, la première exécution de la boucle de lecture prend environ 50% à 60% du temps disponible (je suppose que c'est dû au JIT qui fait son travail), puis pour les boucles suivantes à une consommation régulière de 5%. Le problème est que, si j'exécute l'application sur un ordinateur plus lent, la première exécution prend plus de temps que le temps disponible, provoquant l'interruption de la lecture et le décodage de l'audio de sortie, ce qui est inacceptable. Après cela, il descend à une consommation de 8% -10%.
Même après la première exécution, l'application continue d'appeler de temps en temps des routines qui prennent du temps (toutes les 2 secondes plus ou moins), ce qui entraîne une consommation régulière de 5% à des pics très courts de 20% à 25% . J'ai remarqué que si je laisse l'application fonctionner pendant un certain temps, ces pics vont également descendre à 7% -10%. (Je ne suis pas sûr que cela soit dû à la recompilation par le JIT de ces portions de code).
Donc, j'ai un sérieux problème avec le JIT. Bien que l'application se comporte bien même dans des machines très lentes, ces «tempêtes de compilation» vont être un gros problème. J'essaie de comprendre comment résoudre ce problème et j'ai trouvé une idée, qui est de marquer toutes les routines 'sensibles' avec un attribut qui dira à l'application de les 'presser' au préalable pendant le démarrage , afin qu'ils soient entièrement optimisés quand ils sont vraiment nécessaires. Mais ce n'est qu'une idée (et je ne l'aime pas trop non plus) et je me demande s'il y a une meilleure solution à tout le problème. Je voudrais savoir ce que vous en pensez.
(NGEN l'application est pas une option, je l'aime et que vous souhaitez toutes les optimisations JIT je peux obtenir.)
EDIT:
consommation de mémoire et de collecte des ordures coups de pied ne sont pas un problème, je suis l'utilisation de pools d'objets et le pic maximal de mémoire pendant la lecture est de 304 Kb.
Il serait utile si vous avez dit ** pourquoi ** NGEN n'est pas une option; comprendre le problème est la moitié du travail ... –
Quelles optimisations JIT ne sont pas disponibles lorsque NGen-ing? – Will
@Marc: J'utiliserais l'application en dernier recours, mais je préférerais ne pas l'utiliser s'il existe une meilleure solution. – Trap