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?
Antwort
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.
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.
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.
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. –
@Neil: VirtualAlloc (MEM_COMMIT) reserviert 0 gefüllten Speicher. –
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
es wäre schneller, wenn es einen CPU-Befehl zum Setzen der Speicherzelle auf Null gibt. aber da ist keiner.
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.
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
@Tronic, ich denke, Sie haben Recht, Assembly lesen, es scheint nur, wenn beide Operanden XMM-Register sind, dann verwendet es xor – Anycorn
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. Und einige Betriebssysteme pflegen einen Pool von nullten Seiten, die sie "wenn es Freizeit gibt" auf Null setzen können. – tony
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
Danke für diesen Link. Ich habe noch nie zuvor eine Cache-spezifische Anweisung gesehen. –
- 1. Anonym mmap null gefüllt?
- 2. Open Outlok mit Werten gefüllt mit ASP
- 3. Array (Klasse) gefüllt mit Nicht-Null-Werten bleibt leer
- 4. ListView wird nicht mit Daten gefüllt
- 5. NSArray gefüllt mit bool
- 6. RecyclerView wird nicht mit Elementen gefüllt
- 7. Array wird weiterhin mit falschem Index gefüllt
- 8. d3js choropleth wird nicht gefüllt
- 9. Bild wird nicht gefüllt div
- 10. Dynamic ExpandableList Android - mit Werten aus dem Web gefüllt
- 11. Meine Formularseite mit zuvor übermittelten Daten gefüllt
- 12. Puffer gefüllt mit Papierkorb mit recv
- 13. /vagrant nicht mit Dateien gefüllt
- 14. Bitmapdata.Scan0 Zeiger auf Null zurück Array gefüllt
- 15. Datanucleus gae.pk-id nicht gefüllt mit makePersistent
- 16. FormData nicht gefüllt
- 17. Pandas ersetzen Nullen mit früherem Wert ungleich Null
- 18. Wie wird eine Gridview mit Daten aus einer API gefüllt?
- 19. ListView kann nicht mit Spalten gefüllt werden
- 20. Warum unsigned int Rechtsverschiebung wird immer mit '1' gefüllt
- 21. JTable nicht gefüllt
- 22. Tkinter Text Widget wird nicht gefüllt/erweitern
- 23. Javafx PropertyValueFactory wird nicht gefüllt Tableview
- 24. Wie macht man FloatingActionButtn mit Bild gefüllt?
- 25. Dynamische Generierung eines DropdownLIST-Steuerelements aus einem Array, das mit Text und Werten gefüllt wird
- 26. customer_id ist nicht gefüllt mit Transaktion Tender
- 27. Bootstrap-Tabelle wird nicht gefüllt Containerbreite
- 28. Wie wird das Formular mit mehrdimensionalen JSON-Daten neu gefüllt?
- 29. Django ChoiceField von Datenbankwerten gefüllt
- 30. Bezier close Pfad wird nicht gefüllt
Wie planen diese Stücke auf Null zu setzen? –
@neil, ermmm memset()? aber ich bin offen für Vorschläge. – Mick
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. –