8Bit Array möglichst schnell mit konstante füllen füllen
-
ja stimmt, das ergibt Sinn
allerdings müsste man dann in Assembler ja dann auch ne Schleife machen (loop)
und die müsste auch immer die Abbruch Bedingung überprüfen (cx)
aber x zu überprüfen geht wahrscheinlich auch viel schneller als nen Wert im Speicher
am besten wärs wohl Assembler an der Stelle einzubauen und selber den Speicherbereich kopieren
dann bräuchte man nich mal nen Loop
aber das is dann irgendwie auch verschwendung
das mach ich wenns dann wirklich mal um jedes bisschen Speed geht
-
Ich habe gesagt bei memset gibt es keine Schleife!
Der Assemblerbefehl 'rep' wird benutzt, d.h. die ganze Initialisierung findet in einem einzigen Taktzyklus der CPU statt.
... und wenn du memset benutzt IST die Funktion bereits in Assembler, selbst coden wäre somit kompletter Blödsinn.
-
natürlich ist das Blödsinn
es wäre besser es würden alle zusammen an einem Strang ziehen
aber es kocht nunmal jeder sein eigenes Süppchen
(was man bei Microsoft deutlich merkt)
und so implementier ich meine Funktionen nunmal auch selber,
statt vorgefertigte zu benutzenrep ist aber eigentlich auch ne Schleife
es ruft einen Prozessor Befehl auf verringert cx um 1, überprüft ob cx 0 ist und bricht in dem Fall ab, sonst machts das gleiche nochmalnur wird rep wohl viel schneller sein als loop, oder gar eine c-schleife, die wahrscheinlich gleich aus ein paar dutzend befehlen besteht
-
wenns unbedingt selbstprogrammiert sein muß:
void fast_memset (unsigned char *dst1, unsigned char c, unsigned long cnt) { unsigned long *dst,*end,val,rest; ((char*)&val)[0]=c; ((char*)&val)[1]=c; ((char*)&val)[2]=c; ((char*)&val)[3]=c; rest=cnt&3; // ich unterstelle einfach mal, daß sizeof(long)==4 ist cnt&=0xFFFFFFFC; end=(unsigned long*)(dst1+cnt); dst=(unsigned long*)dst1; while(dst<end) *dst++=val; while(rest--) *(unsigned char*)dst++=c; }
am schnellsten gehts in der regel, wenn dst1 eine durch 4 teilbare addresse ist. das erreichst du am einfachsten, indem du den speicher erst um 3 bytes größer als nötig allozierst und dann die addresse auf durch 4 teilbar rundest.
-
"fast_memset" hat die Funktion als Namen allerdings nicht verdient :p
Was spricht gegen das implementierte memset?
-
Neku schrieb:
"fast_memset" hat die Funktion als Namen allerdings nicht verdient :p
Wieso nicht? es ist "fast" so gut wie das echte memset
-
ne das mach ich in Assembler, das geht noch schneller
aber wie bindete man nochmal Assembler ein?ich dachte immer das geht mit
//C Code asm { //Assembler Code } //C Code
aber das tut es nich
dabei war ich mir sicher das ich das immer so gemacht hab
na egal mal schaun...
-
Ich hab doch jetzt schon zwei Mal erklärt, dass 'memset' bereits eine optimierte, in Assemblercode geschriebene Funktion ist. Ihr werde es mit C++ und anderen eigenen Implementationen nicht schneller hinbekommen!
@CStoll: Du benutzt eine C++-Schleife, die ist nunmal langsamer als die 'rep'-Assemblerinstruktion. Es könnte höchstens noch sein, dass der Compiler das bemerkt und entsprechend optimiert. Dennoch verfügt memset über weitere Optimierungen (wie gesagt, z.B. SIMD).
-
na wenns dir so wichtig ist, dann schau dir halt den assembler code an der jeweils ausgespuckt wird für die verschiedene möglichkeiten. dann weisst du warum welches schneller is
-
Neku schrieb:
@CStoll: Du benutzt eine C++-Schleife, die ist nunmal langsamer als die 'rep'-Assemblerinstruktion.
Ich benutze gar nichts
- und wenn, dann würde ich wohl die vorhandenen Funktionen (sprich: memset()) verwenden.
(ich konnte mir den Kommentar nur einfach nicht verkneifen :D)