Array zurücksetzen (Performance optimiert)
-
memset() -> siehe MSDN.
Der Compiler ist hoffentlich so optimierend und rechnet nicht jedesmal die Adresse aus. Wenn er 0-Optimierer ist dann benütze Zeigerarithmetik. Also Zeiger an den Anfang des Arrays setzen durchlaufen bis 801*601 erreicht ist und die Stelle auf 0 setzen - Pseudocode:
unsigned long int end = 801*601; ptr = array[0][0] // Einmalige Berechnung der Stelle for (unsigned long int i = 0; i < end; ++i, ++ptr) *ptr = 0;
Aber wie gesagt, das wird dir dein Compiler auch so hinoptimieren und memset() auf jeden Fall.
MfG SideWinder
-
N-Dream schrieb:
Oder einfach den Array speicher freigeben, und neu allocieren, dann wären alle Elemente ja auch auf NULL?
Nö, wären sie nicht.
-
Wenn sie das wären, wäre es noch langsamer. Da sie es nicht sind bringts nichts, und wenn du Pech hast ist es trotzdem langsamer
MfG SideWinder
-
Es ist viel schneller mit memset.
Wenn man einfach durch das Array durchspaziert braucht es etwa 3500 Clockticks.
Aber wenn man mit memset arbeitet nur gerade 1800!Also ist memset doppelt so schnell! Wow! Merci
memset( CLayer, 0, 1920000 ); memset( TLayer, 0, 480000 );
Ich nehme 1920000 weil ein Pointer 4 Bytes gross ist (RICHTIG???). 800*600*4
und 480000 weil ein Boolean im Memory 1 Byte gross ist (RICHTIG???).Danke vielmals
-
N-Dream schrieb:
Es ist viel schneller mit memset.
Wenn man einfach durch das Array durchspaziert braucht es etwa 3500 Clockticks.
Aber wenn man mit memset arbeitet nur gerade 1800!Also ist memset doppelt so schnell! Wow! Merci
Hast du das auch im Release-Modus getestet?
-
Da gibts ein Sprachmittel, dass dir diese Fragen erspart -> sizeof(bool)
MfG SideWinder
-
memset( CLayer, 0, 1920000 );
nicht vergessen das 0 hier nicht die dezimale 0 ist, eigentlich ist diese 0 bei memset irgendwas (alle bits auf 0) ob das nun irgendeiner Zahlendarstellung entspricht ist dann nicht mehr vom Standard gedeckt.
bye
tt
-
N-Dream schrieb:
Wenn ich jedes mal wieder muss auf jedes Element zugreifen muss dauert das viel zu lange. Ich möchte mit einem Clocktick alle setzen.
LOL. Dir ist aber schon klar, dass deine Prozessor Pipeline eine begrenzte Datenbreite hat?
Die schnellste portabelste Lösung ist sicherlich memset, da viele Compiler die Funktion als Intrinsic integriert haben. Richtig gute Compiler können allerdings solch einfache Schleifen genauso effizient wie memset umsetzen. Kannst ja aber auch mal SideWinder's Vorschlag umsetzen, und zB SSE benutzen. Damit kannst du 128 Bit (also 16 Byte) in einem CPU Cycle lesen bzw. schreiben. Durch die Intel Spezifikationen ist das ganze auch relativ portabel, zumindest bei Compilern, die diese Spracherweiterungen unterstützen, wie GCC oder MSC.
-
...und imho ist SSE auch auf 3DNow-fähigen Compilern ausführbar. Also auch auf AMD-Prozessoren.
BTW: Mit Debug-& Releasemodus würde ich auch penlihc genau aufpassen. memset() ist in beiden Fallen in reinem hochoptimierendem Assembler geschrieben.
Im Debug-Modus kann er aber deinen Code gar nicht optimieren.
MfG SideWinder
-
SideWinder schrieb:
...und imho ist SSE auch auf 3DNow-fähigen Compilern ausführbar. Also auch auf AMD-Prozessoren.
Da musst du aufpassen. SSE ist meines Wissens bei AMD erst ab dem Athlon XP verfügbar. Mein alter Thunderbird 900 MHz (ich glaub es war die B Version) konnte SSE zB nicht, und als museumsreif kann man die CPU noch nicht bezeichnen.
-
Okay dann ein Prüfung für die Library ob Unterstützng da ist, wie in Zerbsts Buch.
Die Frage nur ob sich der Aufwand für ein 800*600-Feld lonht. Okay letzten Endes lohnt es sich sicherlich, da diese Prüfung nur einmal am Programmstart durchgeführt werden muss. Aber trotzdem. Soviel Arbeit um ein 800*600-Feld auf 0 zu setzen?
Dann lieber die doppelte for-Schleife und im Release-Modus richtig optimieren lassen über Projekteinstellungen bzw. gleich memset().
MfG SideWinder
-
N-Dream schrieb:
@TomasRiker: Natürlich sind die array 801x601...
In Deinem Code steht allerdings [800][600], und das sind dann auch 800x600, und nicht 801x601
ich denke mal, Du willst damit irgendwas Grafisches machen, dann brauchst Du ja die zusätzliche Pixel-Spalte und Zeile nicht.
-
die mem* funktionen sind wirklich schnell, aber sie werden dir viel trauer veruhrsachen wenn du noch probleme hast dich zwischen <= und < zu entscheiden,
ich habe mal mit msvs6.0 eine string klasse geschreiben, die alle möglichen operationen mit 4 bytes gleichzeitig macht (war 4 mal schneller als mit einfachen fors, das hat was mit 1 char i.d.r. 1 byte und 32 bit cpus zu tun) aber schneller als die mem* funktion war es immer noch nicht
dieses wissen kann dir trozdem nutzen, wenn es keine passende mem* funktion gibt versuche 4 bytes auf einmal zu bearbeiten (dirty cast zu int* helfen bei)
aber an deiner stelle würde ich das programm erstmal zu laufen bringen, das wird schon schwer genug sein auch ohne bugs die durch falsche benutzen von den mem* funktion herruhren
-
Gerard schrieb:
die mem* funktionen sind wirklich schnell, aber sie werden dir viel trauer veruhrsachen wenn du noch probleme hast dich zwischen <= und < zu entscheiden
Mein lieber ich glaub ich weiss von was ich rede, und nur weil ich mich einmal um eine zahl in einem Array vertippe (was für diese frage sowieso irrelevant ist), heisst das nicht, dass ich nicht programmieren kann.
Ich sehe die produktivität deines beitrags noch nicht ganz:
"Hey leute ich bin mega krass und habe meine eigene memset-funktion geschrieben, aber sie ist langsamer und du N-Dream bist scheisse weil du dich irrelevant vertippst."
Find ich stark.Danke aber trozdem an alle, die mir geholfen haben! Es ist mitlerweile viel schneller. Wen es interessiert um was es geht:
https://n.ethz.ch/student/vandrin/download/Beasts.exe
Bakterien simulation.
-
N-Dream schrieb:
Gerard schrieb:
die mem* funktionen sind wirklich schnell, aber sie werden dir viel trauer veruhrsachen wenn du noch probleme hast dich zwischen <= und < zu entscheiden
Mein lieber ich glaub ich weiss von was ich rede, und nur weil ich mich einmal um eine zahl in einem Array vertippe (was für diese frage sowieso irrelevant ist), heisst das nicht, dass ich nicht programmieren kann.
Ich sehe die produktivität deines beitrags noch nicht ganz:
"Hey leute ich bin mega krass und habe meine eigene memset-funktion geschrieben, aber sie ist langsamer und du N-Dream bist scheisse weil du dich irrelevant vertippst."
Find ich stark.Danke aber trozdem an alle, die mir geholfen haben! Es ist mitlerweile viel schneller. Wen es interessiert um was es geht:
https://n.ethz.ch/student/vandrin/download/Beasts.exe
Bakterien simulation.Du hast doch sogar extra geschrieben, dass du 801x601 meinst und absichtlich <= benutzt hast und nicht < und jetzt auf einmal nicht mehr
-
ich habe es nicht so gemeint wie du es verstanden hast.
-
sind arrays nicht an einem stück im speicher? => schreib doch das ganze stück einfach platt, memset lässt grüßen
-
ps. access violation at address 00407393 in module 'Beasts.scr'. Read of address 00000028
-
N-Dream schrieb:
Gerard schrieb:
die mem* funktionen sind wirklich schnell, aber sie werden dir viel trauer veruhrsachen wenn du noch probleme hast dich zwischen <= und < zu entscheiden
Mein lieber ich glaub ich weiss von was ich rede, und nur weil ich mich einmal um eine zahl in einem Array vertippe (was für diese frage sowieso irrelevant ist), heisst das nicht, dass ich nicht programmieren kann.
Ich sehe die produktivität deines beitrags noch nicht ganz:
"Hey leute ich bin mega krass und habe meine eigene memset-funktion geschrieben, aber sie ist langsamer und du N-Dream bist scheisse weil du dich irrelevant vertippst."
Find ich stark.Danke aber trozdem an alle, die mir geholfen haben! Es ist mitlerweile viel schneller. Wen es interessiert um was es geht:
https://n.ethz.ch/student/vandrin/download/Beasts.exe
Bakterien simulation.Also ich glaub auch nicht, das du programmieren kannst. Und Compilate werde ich mir von dir nicht runterladen. Dazu bist du nicht vertrauenswürdig genug.
-
@ Gerard: Sorry das ich Dir aso an den Wagen gefahren bin, aber ich hab mich einfach aufgeregt. Tut mir leid
Access Violation sollte gefixt sein.