Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » 8Bit Array mit 32Bit Werten schneller füllen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ]
000
01.03.2006, 15:28 Uhr
Nick H.



Ich hab einen 8Bit-Array, besser bekannt als char-Array
jedes der 786432 Felder will ich möglichst schnell mit dem gleichen Wert füllen
es ist wirklich wichtig dass das so schnell wie möglich geht
die schnellste möglichkeit denke ich ist ihn mit 32-Bit Werten zu füllen
(isn 32-Bit Prozessor)

wenn ich das ganze so mach:


C++:
char array[786432];
for(int i = 0; i < 786432; i++)
{
array[i] = konstante;
}


würde das ja 4x so lange dauern da ich in einem Schritt nur 8Bit kopiere

memcpy wär da schon ne alternative, aber da bräucht ich ja erstmal einen Array der schon voll ist, von dem ich das ganze kopieren kann
und das füllen von dem Array würde dann wieder genauso lange daueren
das hätte nur den Vorteil das ich den nur einmal füllen müsste und dann immer wieder kopieren kann

aber das hört sich für mich trotzdem sinnlos an
man muss ja irgendwie nen bestimmten Bereich mit longs überschreiben können
ich denk mal das geht irgendwie mit Zeigern
ich bräucht ja nur nen long Zeiger auf die Anfangsadresse von dem char-Array
und dann könnt ich den mit longs überschreiben

aber wie genau funktioniert das?
hab noch nich wirklich Ahnung von Zeigern

Dieser Post wurde am 01.03.2006 um 15:29 Uhr von Nick H. editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.03.2006, 15:43 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich kenn keinen weg... für die konstante 0 dürfte es mit memset gehen
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.03.2006, 15:52 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


du kannst bei char arrays jede beliebige konstante mit memset setzen:


C++:
char array[1000];
memset(array, 'F', 1000*sizeof(char));



füllt dir das Array mit F's

Weiß nur nicht ob memset recht viel anderes macht als ne schleife.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.03.2006, 17:03 Uhr
ao

(Operator)



Zitat von FloSoft:
Weiß nur nicht ob memset recht viel anderes macht als ne schleife.

Macht nichts anderes. Ist nur hoch optimiert. Ich würde memset nehmen. Räder, die schon erfunden sind, erfindet man nicht noch mal.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.03.2006, 17:44 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

du kannst bei char arrays jede beliebige konstante mit memset setzen:


das aber nur so lange man den 8 bit raum nicht verlässt... (das wollte ich damit sagen)
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.03.2006, 01:53 Uhr
Nick H.



also ich hab mir das so vorgestellt:

angenommen mal ich will den Array mit der Zahl 192 füllen
192 ist binär 11000000
könnt ich entweder 786432 mal 11000000 kopieren (8 Bit)
oder 786432 / 4 mal das ganze mit 11000000110000001100000011000000 füllen (32 Bit)
was ja bei einem 32 Bit Prozessor genauso schnell gehen würde
und somit die ganze Operation 4 mal so schnell machen würde

in Assembler könnt ich mir das gut vorstellen
die Frage ist halt mit welcher Funktion sich das in C realisieren lässt

ich hab memset noch nich oft benutzt
deswegen weiß ich nich genau wie das das macht
aber memcpy würde ja auf einem 32 Bit System immer 32 Bit Werte kopieren
also denk ich mal

memset(array, 192, 786432 / 4);

würde zum gewünshten Ergebnis führen, oder?
(natürlich schreib ich direkt das Ergebnis von 786432 / 4 rein, nur zum besseren Verständnis)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.03.2006, 02:05 Uhr
Nick H.



ne moment, jetzt hab ich Käse erzählt
das würde ja wieder nur 8 Bit pro Kopiervorgang kopieren
oder is die Funktion in sich schon so optimiert, das die 32 Bit kopiert?
also wohl doch auf int casten
oder einmal nen Array anlegen und immer wieder mit memcpy kopieren

Dieser Post wurde am 02.03.2006 um 02:07 Uhr von Nick H. editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.03.2006, 02:21 Uhr
Nick H.



ja auf int casten war die Lösung:


C++:
for(int i = 0; i < 786432; i += 4)
{
  *(unsigned int*)(array + i) = 0;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.03.2006, 08:06 Uhr
ao

(Operator)



Zitat von Nick H.:
das würde ja wieder nur 8 Bit pro Kopiervorgang kopieren
oder is die Funktion in sich schon so optimiert, das die 32 Bit kopiert?

Bei den Funktionen der C-Lib kann man schon davon ausgehen, dass sie ziemlich gut optimiert sind und dass die Programmierer solche einfachen Tricks kannten. Kannst ja mal probieren, ob du schneller bist. Der Aufruf für memset ist

memset(array, 192, 786432);

Gruß,
ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.03.2006, 12:30 Uhr
Nick H.



stimmt probieren kann mans ja
aber dennoch sollte die Zeigervariante geringfügig schneller sein
da memset ja erstmal überprüfen müsste wie es am schnellsten geht
und auch damit rechnen muss das der Wert nicht durch 4 teilbar ist
aber egal probieren kostet nix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: