2010-03-10 9 views
8

Ich bin nicht sehr Experte, wie Prozessoren arbeiten, aber man könnte sich vorstellen, dass es einfacher war, Teile des Speichers auf Null als Nicht-Null-Werte zu setzen und so kann es marginal schneller sein.Wird Speicher mit Werten ungleich Null langsamer gefüllt als mit Nullen gefüllt?

+0

Wie planen diese Stücke auf Null zu setzen? –

+0

@neil, ermmm memset()? aber ich bin offen für Vorschläge. – Mick

+0

Um die Frage wirklich zu beantworten, müssten Sie sich den Quellcode für Ihre Version von memset ansehen und den Assembler, den Ihr Compiler dafür ausgibt. –

Antwort

8

Ich denke, der einzige Unterschied wäre in der Einrichtung des Registers, das den Wert hat, in den Speicher zu speichern. Einige Prozessoren haben ein Register, das auf Null festgelegt ist (zB i64). Trotzdem wird der winzige Overhead, den es für die Einrichtung eines Registers geben könnte, durch das Schreiben in Erinnerung monströs verzerrt.

Soweit die Zeit, um tatsächlich in den Speicher zu schreiben - das wird auf allen Architekturen die ich kenne vertraut sein.

1

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

1

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

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

+2

Ich weiß nicht, über welche Windows-Zuordnungsfunktion Sie sprechen, aber wenn es sich um GlobalAlloc handelt, reserviert es standardmäßig keinen Nullsatzspeicher, obwohl es angefordert werden kann. –

+0

@Neil: VirtualAlloc (MEM_COMMIT) reserviert 0 gefüllten Speicher. –

+0

Sind Sie sicher für die Windows-Initialisierung? Es wäre ziemlich machtvoll und zeitaufwändig, einen großen Teil des Speichers zu setzen, ob das Programm es erfordert oder nicht, oder nicht? – Seb

0

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

-1

sehr allgemeine 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 registriert sind, dann wird XOR verwendet.

+3

Ummm, würde das nicht einen Speicher lesen erfordern, gefolgt von der XOR-Operation, gefolgt von einem Speicher schreiben? Das wäre sehr langsam. – Tronic

+0

@Tronic, ich denke, Sie haben Recht, Assembly lesen, es scheint nur, wenn beide Operanden XMM-Register sind, dann verwendet es xor – Anycorn

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 könnte Speicher auf Null speziell von O/Hardware als faul Betrieb unterstützt werden, dh des Aktes des tatsächlich Einstellung Speichers auf Null nicht wirklich alles tun, außer einfach Markierung dieser Speicherbereich für Nullstellung beim ersten Lesen. (Natürlich ist so etwas nur mit Speicherbereichen möglich, die auf OS/Hardware-Ebene verwaltet werden).

Letzteres ist tatsächlich einer der Gründe, warum die calloc Funktion existiert: auf einigen Plattformen kann es deutlich effizienter als nur malloc gefolgt von einem memset zu Null implementiert werden. Auf solchen Plattformen wird der Effekt sehr groß und nicht "marginal" sein.

+1

+1. Und einige Betriebssysteme pflegen einen Pool von nullten Seiten, die sie "wenn es Freizeit gibt" auf Null setzen können. – tony

2

Es kann auf PPC schneller 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: Sie http://www.ibm.com/developerworks/power/library/pa-memory/index.html

+0

Danke für diesen Link. Ich habe noch nie zuvor eine Cache-spezifische Anweisung gesehen. –

Verwandte Themen