Performance D'une application C# construite sur la plate-forme AnyCPU vs x64 sur une machine 64 bits
Je dois déployer une application C# sur une machine 64 bits bien qu'il y ait une légère probabilité qu'elle puisse également être déployée sur une machine 32 bits. Dois-je construire deux exécutables distincts ciblant la plate-forme x86 et x64 ou devrais-je opter pour un seul exécutable construit ciblant la plate-forme 'AnyCPU' (spécifiée dans L'option de construction de la propriété project'. Y aurait-il une différence de performance entre un assemblage c # construit ciblant 'AnyCPU' est déployé sur une machine 64 bits vs le même assemblage construit cibler spécifiquement la plate-forme "x64"?
2 réponses
Non, il n'y a pas de différence de performance entre une application AnyCPU s'exécutant sur un Windows 64 bits et une application x64 s'exécutant dessus. La seule chose que flag change sont des drapeaux dans l'en-tête de l'assembly compilé et le CLR l'utilise uniquement pour décider d'utiliser x86 ou x64, rien d'autre
Si vous demandiez s'il y a une différence entre l'application x86 s'exécutant sur un Windows 64 bits et un x64 (ou AnyCPU), alors la réponse serait oui. Les différences entre les deux sont:
- 64 bits utilise évidemment des références deux fois plus grandes que 32 bits, ce qui signifie une plus grande consommation de mémoire, mais cela signifie également que vous pouvez utiliser plus de mémoire
- 64 bits peut utiliser plus de registres qui ne sont disponibles que dans le mode 64 bits des Processeurs
- le JIT 64 bits est différent du JIT 32 bits, il a un ensemble d'optimisations différent: par exemple, le JIT 64 bits utilise parfois l'optimisation des appels de queue Même si vous ne le demandez pas spécifiquement en utilisant le
tail.
instruction (ce que par exemple C# ne fait jamais)
Comme une note de côté à la réponse ci-dessus. Il y a Peut des problèmes avec l'utilisation de P / Invoke ou DotNetInterop dans les DLL x86 sur un système d'exploitation x64 utilisant AnyCPU. Dans le cas où aucune version 64 bits de la DLL n'est disponible, il peut être nécessaire de compiler x86 plutôt que AnyCPU car le système d'exploitation va essayer de charger la version 64 bits...et l'échec.