Windows Phone 8 et la compilation dans le nuage

Si vous ne le savez pas encore, lorsque vous téléchargez une application depuis le Store sur un Windows Phone 8, celle-ci est “compilé dans le nuage” lors de la soumission.

Quand vous soumettez votre XAP sur le dev center, MDILBinder est exécuté et crée un nouvelle librairie MDIL. Par conséquent, le XAP que l’utilisateur télécharge sur son téléphone n’aura pas le même code MSIL que celui créé par le développeur. Les binaires MDIL binaries seront alors linké aux assemblies plateform sur le téléphone à l’installation. L’utilisateur aura alors une application native et sera donc beaucoup plus performante au lancement et à l’exécution.

Tout ceci est dû à la migration de Windows Phone 8 vers CoreCLR qui permet d’utiliser NGEN (Native Image Generator).

L’outil Native Image Generator Tool (Ngen.exe) est un outil qui améliore les performances des applications managées. Ngen.exe crée des images natives, lesquelles sont des fichiers qui contiennent le code machine spécifique au processeur compilé et les installent dans le cache des images natives sur l’ordinateur local. Le runtime peut utiliser à la place des images natives du cache à l’aide du compilateur juste-à-temps (JIT) pour compiler l’assembly d’origine.

 

 

Toutefois, NGen est un assez lourd et prendrait trop de temps sur nos téléphones. Microsoft a donc eu la brillante idée de réaliser tout cela dans le cloud. Microsoft maitrise ses plateformes mobiles (processeurs, etc…), il lui est donc facile de cibler un device particulier.

Tout ceci à pour conséquence un gain assez relatif de perfomances des applications.

Mais quid de visual studio ?

En effet, comment tester avant déploiement sur le Store les performances de mon application “ngenisé” ?

En fait, lorsque vous utilisez le menu “deployer mon application”, Visual Studio “ngenise” vos DLLs avant envoie vers le téléphone. Ceci est notamment visible dans la console :

A noter, ceci est le cas quelque soit votre configuration : Debug ou Release !

Dans tous les cas ?

Non évidemment, les dlls ne sont optimisées que lorsque la cible est un Windows Phone 8, si on déploie vers un Windows Phone 7 ou un émulateur, aucune optimisation se sera faite et c’est toujours le MSIL qui sera déployé.

Comment fait-il pour déboguer le code optimisé  ?

Là ça commence à être compliqué, y’a d’un côté ngen (qui est toujours exécuté) et le niveau de l’optimisation du code. Pour retrouver des performances assez proche du Store, il faut modifier la configuration de votre visual.

Dans le menu Debug, sélectionnez le menu “options and settings…”

Allez dans l’onglet Debugging, puis Général.

Enfin décochez “Suppress JIT optimization on module load (Managed only)” ainsi que “Enable Just My Code” (car il considére le code optimisé de votre app comme n’étant pas le votre).

Vous aurez alors beaucoup moins d’informations de déboguage (notamment les onglets Locals et Auto qui seront quasi vide), mais vous pourrez déboguez des soucis qui interviendrait qu’en cas d’optimisation (rare)