Befüllt Speicher mit Werten ungleich null langsamer als mit Nullen?

8

Ich bin nicht sehr erfahren, wie Prozessoren funktionieren, aber man könnte sich vorstellen, dass es einfacher ist, Teile des Speichers auf Null zu setzen als Werte, die nicht Null sind, und daher kann es marginal schneller sein.

    
Mick 10.03.2010, 17:37
quelle

7 Antworten

8

Ich denke, der einzige Unterschied besteht darin, das Register einzurichten, in dem der Wert gespeichert werden soll. Einige Prozessoren haben ein Register, das auf Null festgelegt ist (zB i64). Doch was auch immer der kleinste Aufwand für die Einrichtung eines Registers sein mag, wird durch das Schreiben in Erinnerung monströs verzerrt.

Was die Zeit betrifft, um tatsächlich in den Speicher zu schreiben - das wird auf allen Architekturen, die mir vertraut sind, gleich sein.

    
Michael Burr 10.03.2010, 17:40
quelle
3

Theoretisch könnte es in der Tat schneller sein.

Erstens bietet die Hardwareplattform möglicherweise dedizierte CPU-Befehle, die den Speicher auf Null setzen.

Zweitens kann die spezifische Einstellung von Speicher auf Null von OS / Hardware als eine faule Operation unterstützt werden, dh die tatsächliche Einstellung von Speicher auf Null macht nichts außer einfach Markierung dieser Speicherbereich zum Nullsetzen beim ersten Lesen. (Natürlich ist so etwas nur mit Speicherbereichen möglich, die auf OS / Hardware-Ebene verwaltet werden).

Letzteres ist einer der Gründe, warum die Funktion calloc existiert: Auf einigen Plattformen kann sie wesentlich effizienter implementiert werden als ein reines malloc gefolgt von einem memset auf Null. Auf solchen Plattformen wird der Effekt sehr groß und nicht "marginal" sein.

    
AnT 10.03.2010 17:52
quelle
2

Es kann schneller auf PPC sein, wenn Sie die Puffer ausrichten, da Sie einfach die Anweisung dcbz cache verwenden können. Es ist nicht etwas, auf das Sie in allen Fällen schneller zählen sollten.

Ein Artikel, der dies erwähnt: Ссылка

    
Dan Olson 10.03.2010 17:53
quelle
1

Wenn Sie dies mit Hilfe des virtuellen Speichersystems tun können, können Sie auf null gestellte (nicht zugewiesene) Seiten schneller als auf Seiten ungleich Null setzen. Eine solche Optimierung wird normalerweise nicht in C ++ - Anwendungen (z. B. der Standardbibliotheksimplementierung) verwendet. Erwarten Sie daher keinen Unterschied zwischen der Zuweisung eines std :: vectors, das mit Null gefüllt ist, gegen einen anderen Wert.

    
Tronic 10.03.2010 17:39
quelle
1

Ich habe keine Ahnung, wegen der Anzahl der beteiligten Faktoren, aber die Art und Weise herauszufinden ist, beide Wege zu kodieren und sie zu benchmarken.

Beachten Sie, dass die Funktion Windows VirtualAlloc den neu zugewiesenen Speicher auf Null initialisiert, obwohl die Debug-C ++ - Laufzeit von Microsoft sie anschließend für Dummy-Werte zurücksetzt. Wenn Sie eine schnelle Quelle für null initialisierten Speicher wünschen, kann es sich lohnen, direkt zum Betriebssystem zu gehen.

    
Tim Robinson 10.03.2010 17:40
quelle
0

es wäre schneller, wenn es eine CPU-Anweisung zum Setzen der Speicherzelle auf Null gibt. aber da ist keiner.

    
Andrey 10.03.2010 17:41
quelle
-1

sehr häufige Optimierung auf Intel-Architektur, ist xor a,b Operation verwenden, wo beide Operanden sind der gleiche Speicherort. Dadurch entfällt die Notwendigkeit, den Wert im Register zu speichern und den Verschiebevorgang auszuführen. Wenn die Bibliothek diese Optimierung verwendet, ist das Schreiben von Nullen schneller.

Ich muss mich selbst korrigieren, nur wenn beide Operanden sich registrieren, dann wird XOR verwendet.

    
Anycorn 10.03.2010 17:45
quelle

Tags und Links