Notez que l'espace d'adressage peut être utilisé pour plus que la mémoire (réelle). Il est également possible de mapper en mémoire de gros fichiers, ce qui peut améliorer les performances dans des schémas d'accès plus étranges, car la mise en cache au niveau de la VM, plus puissante et plus efficace, entre en jeu. Il est également plus sûr d'allouer de grands blocs de mémoire sur 64 bits car le gestionnaire de tas est moins susceptible de rencontrer une fragmentation de l'espace d'adressage qui ne lui permettra pas d'allouer un grand bloc.
Certaines des choses dites dans ce fil (comme le doublement du nombre de registres) ne s'appliquent qu'à x86-> x86_64, et non à 64 bits en général. Tout comme le fait que sous x86_64, on a la garantie d'avoir SSE2, des opcodes 686 et un moyen bon marché de faire du PIC. Ces caractéristiques ne sont pas strictement liées au 64 bits, mais à la réduction de l'héritage et à la correction des limitations connues du x86.
De plus, les gens pointent souvent du doigt le doublement des registres comme étant la cause de l'accélération, alors que c'est plus probablement l'utilisation par défaut de SSE2 qui fait l'affaire (en accélérant memcpy et les fonctions similaires). Si vous activez le même ensemble pour x86, la différence est beaucoup plus faible. (*) (***)
Gardez également à l'esprit qu'il y a souvent une pénalité initiale impliquée parce que la structure de données moyenne augmentera simplement parce que la taille d'un pointeur est plus grande. Cela a également des effets sur le cache, mais est plus perceptible dans le fait que le memcpy() moyen (ou l'équivalent de la copie de mémoire dans votre langage) prendra plus de temps. Ce n'est que de l'ordre de quelques pourcents, mais les gains de vitesse mentionnés ci-dessus sont également de cet ordre.
En général, la surcharge d'alignement est également plus importante sur les architectures 64 bits (les enregistrements qui n'étaient auparavant que 32 bits deviennent souvent un mélange de valeurs 32 bits et 64 bits), ce qui gonfle encore plus les structures.
Dans l'ensemble, mes tests simples indiquent qu'ils s'annuleront grosso modo, si les pilotes et les bibliothèques d'exécution se sont pleinement adaptés, ne donnant pas de différence de vitesse significative pour l'application moyenne. Cependant, certaines applications peuvent soudainement devenir plus rapides (par exemple, lorsqu'elles dépendent de l'AES) ou plus lentes (une structure de données cruciale est constamment déplacée, scannée ou parcourue et contient beaucoup de pointeurs). Les tests ont été effectués sous Windows, et l'optimisation du PIC n'a donc pas été évaluée.
Notez que la plupart des langages JIT-VM (Java, .NET) utilisent en moyenne beaucoup plus de pointeurs (en interne) que le C++, par exemple. Il est probable que leur utilisation de la mémoire augmente plus que pour le programme moyen, mais je n'ose pas l'assimiler directement à des effets de ralentissement (puisqu'il s'agit d'une bête complexe et funky, souvent difficile à prévoir sans mesure).
Windows 64 bits utilise par défaut SSE2 pour la virgule flottante, ce qui semble accélérer les opérations simples et ralentir les opérations complexes (sin, cos, etc.).
(*) un fait peu connu est que le nombre de registres SSE double également en mode 64 bits.
(**) Le Dr Dobbs a publié un article intéressant à ce sujet il y a quelques années.
0 votes
Il y a beaucoup de confusions ici, et ailleurs sur le web, entre l'adressage physique (accès à la RAM), PEA affecte cela, la carte mère affecte cela, et l'adressage logique (mémoire virtuelle par processus). Sur un système d'exploitation 32 bits, la mémoire virtuelle est limitée à 4 Go, moins ce que le noyau réserve. Elle est indépendante de la RAM : vous pourriez avoir 0,1 Mo ou 8 Go de RAM et vous auriez exactement 4 Go de mémoire virtuelle (mais une partie réservée par le noyau). PEA peut être utilisé pour avoir plus de RAM, mais n'est pas une réponse parfaite car le noyau NE PEUT PAS accéder à toute la mémoire.