Je ne suis pas très expert sur la façon dont les processeurs fonctionnent, mais on pourrait imaginer qu'il était plus facile de définir des morceaux de mémoire à zéro que des valeurs non nulles et qu'il peut donc être marginalement plus rapide. P>
7 Réponses :
Si vous pouvez le faire à l'aide du système de mémoire virtuelle, vous pouvez obtenir des pages à zéro (non allouées) plus rapidement que les pages non nulles. Une telle optimisation n'est normalement pas utilisée dans les applications C ++ (par exemple, la mise en œuvre de la bibliothèque standard), alors ne vous attendez donc pas à obtenir une différence entre l'allocation de STD :: Vecteur rempli de zéro par rapport à une autre valeur. P>
Je pense que la seule différence serait dans la configuration du registre qui a la valeur à stocker dans la mémoire. Certains processeurs ont un registre qui est fixé à zéro (IA64 par exemple). Malgré tout, quelles que soient les frais de surcharge minuscule pour la mise en place d'un registre seraient monstrueusement à la mémoire de la mémoire. P>
En ce qui concerne le temps d'écrire à la mémoire - qui sera la même sur toutes les architectures que je connaisse. P>
Je n'ai aucune idée, en raison du nombre de facteurs impliqués, mais la façon de découvrir est de coder les deux sens et de les repasser. P>
Il convient de noter que la fonction Windows Virtualalloc CODE> Initialise la mémoire nouvellement allouée à zéro, bien que le Microsoft Debug C ++ Runtime la réinitialise sur des valeurs nominales pour vous. Si vous souhaitez une source rapide de mémoire initialisée zéro, il peut être intéressant d'aller directement au système d'exploitation. P>
Je ne sais pas quelle fonction de l'allocation de Windows dont vous parlez, mais si c'est globalalLococ, il n'alloit pas la mémoire zéro par défaut, bien qu'elle puisse la demander.
@Neil: Virtualalloc (Mem_Commit) alloue 0 mémoire remplie.
Êtes-vous sûr de la chose d'initialisation de Windows? Ce serait tout à fait du pouvoir et de prendre beaucoup de temps pour définir une grande partie de la mémoire si le programme l'exige ou non, n'est-ce pas?
BTW, si vous devez le comparer, vous devez également envisager l'impact de la valeur existante dans la mémoire. Peut-être écraser 0S est-il plus cher que l'écrasement 0XFFS? ;) JK
@Seb: Un processus qui demande une nouvelle page l'obtiendra dans la liste des pages zéro. Sinon, un processus peut obtenir une page avec du contenu laissé à partir d'un autre processus, ce qui est une énorme violation de la sécurité. Le noyau sera zéro à des pages libres lorsque la liste des pages zéro devient faible. C'est tout décrit Din Solomon et Russinovich Book.
@Remus Le fait que c'est fait par le noyau ne le rend pas automatiquement plus rapide, cependant.
@Neil le fait que le noyau effectue déjà que le noyau rend la mémoire de refermer de Virtualalloc redondant.
@Neil: Mon commentaire ne concerne que si une allocation zéro existe ou non. Je n'ai fait aucun commentaire sur le sujet PO, qu'il soit plus rapide ou plus lent qu'un modèle de motif non nul.
Lorsque VirtualALLOC CODE> Mémoire remplie d'Allocatec à zéro, il effectue en effectuant la mise à zéro paresseux i>, comme je l'ai décrit dans ma réponse. La mise à zéro physique a lieu à la base de la première page sur la première lecture (si le premier accès est en effet Lire i> -Access) et ne se déroule jamais si le premier accès est en écriture. Ceci est en effet beaucoup plus rapide en général que de manière inconditionnelle dans la région de la mémoire avec Memset code>.
Je pourrais être à l'aise de choses à manifestation. Comme il est fait de la base de la page (si cela en est ainsi), bien sûr, bien sûr, le seul cas lorsque nous pouvons éviter la mise à zéro physiquement, c'est quand le premier accès est une pleine page i> écrire -accès.
@Andreyt: la première fois qu'un défaut de page se produit sur une page nouvellement allouée, le système obtiendra une page dans la liste zéro et l'attribuez au processus. Vous décrivez comme si la page est allouée et marquée comme protégée, puis éteinte de zéro sur l'accès (c'est-à-dire la réduction de zéro paresseux), qui est inexacte.
@REMUS RUSANU: Je crois que je l'ai vu décrit de cette manière (comme zéro de paresseux) dans les "fenêtres avancées" de Jeffrey Richter. C'était il y a un moment, il pourrait donc être obsolète.
@Andreyt: Voir le "diagramme d'état pour les cadres de page" à la page 808 dans Amazon.com/... (vous pouvez" regarder à l'intérieur "sur Amazon et rechercher le titre de la figure).
Ce serait plus rapide s'il y a une instruction CPU pour régler la cellule de mémoire à zéro. Mais il n'y en a pas. P>
Optimisation très courante sur l'architecture Intel, est d'utiliser le fonctionnement Je dois me corriger, seulement si les deux opérandes seregistrent, alors XOR est utilisé. P> XOR A, B CODE> où les deux opérandes sont la même emplacement mémoire. Cela supprime tout besoin de stocker la valeur dans le registre et effectuer une opération de déplacement. Donc, si la bibliothèque utilise cette optimisation, la rédaction de zéros est plus rapide. P>
Ummh, n'aurait-il pas besoin d'une lecture de mémoire, suivie de l'opération XOR, puis suivie d'une mémoire écrite? Ce serait très lent.
@Tronic, je pense que vous avez raison, de l'assemblage de lecture, il ne semble que lorsque les deux opérandes sont des registres XMM, alors il utilise XOR
théoriquement, cela pourrait être effectivement plus rapide. p>
Premièrement, la plate-forme matérielle peut proposer une ou plusieurs instructions de CPU dédiées qui définit la mémoire à zéro. P>
Deuxièmement, le réglage de la mémoire à zéro peut être supporté spécifiquement par OS / Matériel sous forme de fonctionnement paresseux em>, c'est-à-dire que l'acte de réglage réellement de la mémoire à zéro ne fait pas vraiment rien d'autre que le marquage tout simplement em> cette région de mémoire pour la mise à zéro sur la première lecture. (Bien sûr, quelque chose comme celui-ci n'est possible que avec des régions de mémoire gérées au niveau du système d'exploitation / matériel). P>
Ce dernier est l'une des raisons pour lesquelles la fonction calloc code> existe: sur certaines plates-formes, elle peut être implémentée de manière significative plus efficacement qu'un simple MALLOC code> suivi d'un MEMSET code> à zéro. Sur de telles plates-formes, l'effet sera largement grand, pas "marginal". P>
+1. Et certains OSES maintiennent une piscine de pages à zéro, qu'ils peuvent zéro 'quand il y a du temps libre ».
Il peut être plus rapide sur PPC si vous alignez les tampons, car vous pouvez simplement utiliser l'instruction de cache DCBZ. Ce n'est pas quelque chose que vous devriez compter comme étant plus rapide dans tous les cas. P>
Un article qui mentionne ceci: http: // www .ibm.com / DeveloperWorks / Power / Bibliothèque / PA-Memory / Index.html P>
Merci pour ce lien. Je n'ai jamais vu une instruction spécifique au cache auparavant.
Comment envisagez-vous de définir ces morceaux à zéro?
@Neil, Memset ERMMM ()? Mais je suis ouvert aux suggestions.
Pour répondre vraiment à la question, vous devrez examiner le code source de votre version de Memset et l'assembleur que votre compilateur émet pour cela.
Si le but de la mise à zéro de la mémoire est la sécurité (par exemple, Effacer le mot de passe de la variable), l'API appropriée est Securyzeromemorie ( msdn.microsoft.com/en-us/library/aa366877%28vs.85%29.aspx )
C'est beaucoup plus rapide - vous venez de tirer le cordon d'alimentation ...
@TMN: Vous devriez avoir de bons réflexes damnés pour "Yanking le cordon d'alimentation" pour être plus rapide que de régler de manière programmée de quelques Go de RAM à zéro. ;)