Array = 0 setzen
-
Also wenn diese Methode nicht ordentlich über die Array-Grenzen hinwegschießt
-
memset dürfte immer schneller als irgendein C++ Code sein.
Du musst nur aufpassen, dass die Arrayelemente nicht Objekte einer Klasse mit virtuellen Funktionen sind, sonst killst du die vtable.
-
int * array; // Array allokieren array = new int[100]; // Array löschen delete [] array; // Array allokieren array = new int[100]; // natürlich ist es leer
MfG
Edit: Fehlt nur noch das Nullsetzen. *g*
-
Wozu ist dein Code jetzt gut??
-
Saiyaman schrieb:
int * array; // Array allokieren array = new int[100]; // Array löschen delete [] array; // Array allokieren array = new int[100]; // natürlich ist es leer
MfG
Edit: Fehlt nur noch das Nullsetzen. *g*
Definiere leer.
-
Also wenn diese Methode nicht ordentlich über die Array-Grenzen hinwegschießt
...das ist wohl war! Also : ARRAYGROESSE/4
memset dürfte immer schneller als irgendein C++ Code sein
Eigentlich sollte man das annehmen. Das hängt aber von verschiedenen Dingen ab:
- Groesse des arrays
- was vorher im cache bearbeitet wurde
- ob man einen guten/neueren Compiler benutztLetztendlich wird aus jedem C++ Code auch nur Maschinencode, ebenso wie memset!
Muesste man mal ausmessen, wie schnell sich welche Funktion für grosse arrays verhält.
-
ein gutes std::fill(_n) ruft intern std::memset auf, oder verwendet den selben algorithmus (natürlich nur für builtins)
eine Schleife kann nicht schneller sein als memset - denn wenn das der Fall ist, würde ich sofort den Compiler wechseln. Schließlich sollte memset perfekt auf die verwendete Plattform optimiert sein.
Aber warum macht ihr nicht einfach benchmarks?
-
Sollte man bei Zeiten durchaus mal tun!
Bis dahin -> www.google.de - memset loop benchmark
-
Wie wär's mit einem 2. Array gleicher Größe. Das setzt man dann einmal Null. Bei Bedarf das 2. Array dem 1. Array zuweisen.
MfG
-
Das wäre sogar (ein bisschen) langsamer als die for-loop Methode oder die memset-Funktion.
-
flouser schrieb:
...das ist wohl war! Also : ARRAYGROESSE/4
Was wenn ARRAYGROESSE nicht durch 4 teilbar? Ausserdem wanderst du in der Schleife trotzdem nur um 1 Element weiter.
-
Diese seltsame forschleife ist sowieso absoluter blödsinn!
ob ich jetzt:mov cx, 100 ; arraysize zero_array: mov byte [es:di], 0 inc di loop zero_array
oder:
mov cx, 25 ; arraysize/4 zero_array: mov byte [es:di], 0 inc di mov byte [es:di], 0 inc di mov byte [es:di], 0 inc di mov byte [es:di], 0 inc di loop zero_array
schreibe, ändert nichts an der geschwindigkeit!
-
DennisB schrieb:
schreibe, ändert nichts an der geschwindigkeit!
Natürlich tut es das.
1. werden nur ein viertel der vergleiche durchgeführt und
2. werden nur ein viertel der jumps durchgeführt.Siehe einfach Duffs Device
Allerdings sollten gute Compile Loopunrolling beherrschen.
-
Ich hab den Assembler-Code zwar verstanden, finde aber trotzdem, dass er nicht ins C++-Forum gehört.
-
CarstenJ schrieb:
Vielleicht solltest du mal erklären, was du genau vorhast. Ich bin davon überzeugt, dass sich eine andere Lösung finden lässt.
Das Anwendungsgebiet ist ein Schachprogramm. Das Array wird für die Felderkontrolle gebraucht und wird in mehrern Funktionen während der Bewertungsfunktion aktualisiert und benötigt, muss aber natürlich vor jedem Aufrufen der Bewertungsfunktion wieder = 0 gesetzt werden.
Danke für die Hilfe aller Forumsteilnehmer.
MfG
modus
-
Dazu benötigst du aber a) kein Array und b) bestimmt kein globales.
-
for ( int i = 0; i < ARRAYGROESSE/4; i++ ) { array[i] = 0; array[++i] = 0; array[++i] = 0; array[++i] = 0; }
ist ebenfalls inkorrekt, man muss beachten, dass die modifizierten i-Werte auch im for-Schleifenkopf verändert sind.
Somit läuft das Teil in Viererschritten und somit müsste es auf diese Weise etwa 28 von 100 Teilen des Arrays = 0 setzen, was nicht den Erwartungen entspricht. (weil 100/4 = 25 aber das Teil nur in Viererschritten läuft)Ansonsten finde ich ebenfalls, dass das bestimmt falsch konzipiert ist, denn sowas ist eigentlich oft unsinnig.
MfG MAV
-
Mis2com schrieb:
Ansonsten finde ich ebenfalls, dass das bestimmt falsch konzipiert ist, denn sowas ist eigentlich oft unsinnig.
So eine Schleife ist immer unnötig, da wir std::memset, std::fill und std::fill_n haben.
Aber irgendwie scheint mich niemand ernstzunehmen
-
Aber irgendwie scheint mich niemand ernstzunehmen
Ja, der Thread ist ziemlich lustig. Irgendwie werden deine Posts immer übersprungen.
Also, für die, die es noch nicht gesehen haben: Shade Of Mine hat in diesem Thread auch etwas sehr sinnvolles geschreiben. Vielleicht einfach mal lsesen!
-
Natürlich ist es sinnvoll memset zu benutzen.
Aber nicht umsonst gibt es z.B. für den Intel Compiler Datentypen (builtin Typen) die genau dieses loop unrolling unterstützen.
Trotdem benutze auch ich memset - auch weil ich keinen Intel Compiler habe
Wie die sich auf die Zeit auswirken - keine Ahnung!