Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

11

15.06.2014, 14:33

4MB? 8| Eine Cacheline ist auf dem x86/x64 wohl 64Byte groß. Die CPU lädt schon im voraus, wahrscheinlich sogar gelegentlich über die Cacheline voraus, aber 4MB ziemlich sicher eher nicht. Das wäre beinahe ja größer als der gesamte CPU Cache egal ob L1, L2, L3. Ansonsten will ich nichts anderes behauptet haben.

Einen Nachteil den ich halt "std::unordered_map" anrechne, ist halt, die noch schlechtere Ausnutzung des Speichers. Die enthaltenen Objekte verteilen sich ja nie gleichmäßig über die gesamte Hash-Tabelle sondern es sind entweder noch Einträge leer -> Das heißt viel nutzloser Speicher wandert beim Zugriff mit in dem Cache und steht dem restlichen Programm nicht zur Verfügung oder aber, es beginnen sich auch wieder mehrere Elemente in einem Eintrag zu sammeln, das heißt O(1) ist nicht mehr gegeben. Und um das zu Verwalten sind wieder Zeiger/Allokationen nötig. "std::unordered_map" wurde, soweit ich weiß, für größere Datenmengen entworfen. Um sicher zu entscheiden was im Vorteil liegt, ist gewissenhaftes Testen und darauffolgendes Profiling in der Praxis notwendig.

Aber beim einmaligen Anlegen auch mein vorsortierter-Array/Vector-Vorschlag. Keine Lücken, kein verschwendeter Speicher oder Cache, keine überflüssigen Allokation, nichtmal sinnlose Zeiger. Bei dauernder Änderung des Inhalt schnell natürlich so gut wie unbrauchbar.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (06.07.2014, 20:19)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

12

15.06.2014, 14:53

Meiner Meinung nach ist es sinnvoll wenn man mal selbst verschiedene Container implementiert. Das müssen natürlich keine total ausgereiften generischen was weiß ich Container sein. Einfach mal Queue, Stack, Hash-Map, Linked-List, Skip-List, etc vornehmen und los legen. Hilfreich sind da teilweise Erstsemesterskripte. Mir hat das zumindest damals gut geholfen. Man kennt halt nicht nur die Unterschiede bei Vor- und Nachteilen sondern versteht auch warum es eben so ausfällt. Wie gesagt reichen meiner Meinung nach auch vereinfachte Formen. Zum Beispiel einfach nur Datenstrukturen die den Typ int halten können. Mit der grundlegenden Vorstellung kann man dann schneller neue Container verstehen und hat (so wie ich zumindest finde) eine gewisse Vorstellungskraft wie der neue Container in etwa arbeitet.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

13

15.06.2014, 15:03

Ja 4MB war überzogen ;) Ist doch egal es geht ums Prinzip.
Und das geht hier sowieso schon wieder in Richtung Haarspalterei.

Werbeanzeige