Put-Pixel-Routine beschleunigen



  • @VollTroll-Germania doch schon... aber ich weiß net genau was die movedata funktion macht



  • Sie kopiert den Speicherinhalt mit der Länge die du ihm als letzten Parameter angibst. Die Fkt.:FP_SEG ermittelt zum Beispiel die Segment-Adresse fürs Kopieren. Sonst noch fragen ?



  • Macht euch doch mal klar was ihr da vorhabt. Ihr wollt 1 byte in den speicher
    schreiben. Und ihr verwendet dazu allen ernstes eine eigene Funktion und meint diese sei
    schneller wenn ihr shiftet oder gar alles in asm schreibt.

    Das hier hat vc aus der funktion gemacht:
    void put_pixel(int x, int y, int color, unsigned char *adr) {
    (adr+x+(y320))=color;
    }

    lea eax,dword ptr [edx+edx*4]
    mov edx,dword ptr [esp+8]
    shl eax,6
    add eax,edx
    mov dl,byte ptr [esp+4]
    mov byte ptr [eax+ecx],dl
    ret

    Nochmal: <1 byte in den speicher schreiben!> M$´s VC optimiert sogar den stackframe weg
    und scheint nen _fastcall aus der funktion gemacht zu haben.
    Bleiben aber immernoch stackoperationen(call,ret) übrig und noch dazu wird der IP
    verändert(call). Wisst ihr was ein push im schlimmsten fall mit dem cache anrichten kann.
    Das kann u.U. länger dauer als eure gesammte optimierte funktion. Und ein call spült die
    Prefetch-Queue das klo runter. Also weg mit der Funktion(kein call, kein ret, kein push):

    #define put_pixel(x,y,color,adr) ((adr+x+(y320))=color)

    z.B:
    put_pixel(10,10,128,buff);
    ..erzeugt..
    mov byte ptr [_buff(0x00414c0a)+0C8Ah],80h

    oder:
    int x;
    int y=10;
    int col=128;
    for(x=0;x<10;x++)
    put_pixel(x,y,col,buff);

    ..erzeugt..

    mov eax,80808080h
    mov [_buff(0x00414c00)+0C80h],eax
    mov [_buff(0x00414c04)+0C84h],eax
    mov [_buff(0x00414c08)+0C88h],ax

    Und man braucht nicht einmal shiften, das macht der alles von selbst wenn nötig. Und noch
    viel besser, jedesmal wenn das makro verwendet wird erzeugt der compiler eine komplett
    angepasste version die sich wunderbar in den umgebende code (schleife, if-statement)
    anpasst. Und das ganz ohne ASM.

    Mal ehrlich glaubt ihr wirklich M$ verlangt solche preise nur für die
    entwicklungsumgebung?? Editor mit syntaxhighlight gibt es schon für umsonst.

    Ich meine es ist um einiges effizienter wenn man lernt, wie man seinem Compiler die
    richtige vorlage gibt anstatt ihm gleich zu mistrauen und anfängt takte zu zählen.

    Das soll aber nicht bedeuten das asm optimieren völlig unnötig sei, man denke da nur an
    MMX un Co., aber in den anderen fällen sollte das nur nötig sein wenn das projekt fast
    fertig ist und einige profiler läufe anlass dazu geben. z.B.: ist putPixel wirklich dafür
    verantwortlich das das prog. nicht schnell genug läuft?

    MFG
    mondo



  • Original erstellt von mondo:
    **...
    **

    *zustimm*
    Aber bitte nimm das #define zurück und sag inline.



  • @mondo: War ja nett gemeint, aber vielleicht solltest du auch die Ausgabe des Programms dann mal kontrollieren. Mein Programm läuft damit keinen Deut schneller, aber dafür wird die Darstellung falsch, alle Ausgaben landen in der ersten Zeile. Da probiere ich es doch lieber mal mit shiften ! Trotzdem danke



  • Aber auch shiften macht das Programm nicht schneller. Wie kingruedi schon zeigte, erzeugt der Compiler sehr viel mehr Befehle beim shiften ! Vielleicht hebt sich dadurch der Vorteil von shift gegenüber den Multiplikationen wieder auf.



  • <ist putPixel wirklich dafür verantwortlich das das prog. nicht schnell genug läuft?>

    Es ging mir ja auch erst mal ums prinzip. Wenn des Macro nicht läuft, dann korrigier es doch. Aber wenn Du meinst eine funktion sei schneller ... dann nimm halt ne funktion. 😃

    happy coding 🙄



  • Ganz klar ist ein Macro schneller. Aber es ging ja auch eigentlich nicht darum, ob ein Macro schneller ist als eine Funktion. Naja - wie dem auch sei: Realistisch gesehen braucht ja auch Mensch eine Pixel-Funktion. Wenn ich Pixel ausgebe, dann sowieso als Schleife. Ob nun Rechteck, Kreis, Picture oder was auch immer.



  • @Nubuo T.: Ich habe herausgefunden, dass die Bremse nicht die put_pixel-Routine ist, sondern das kopieren des Puffers. Ich benutze dafür movedata in c, aber auch movmem bringt nicht mehr speed. Was könnte man da mit Assembler herausholen ? Könnte mir jemand da Tipps geben, wie man einen 64000 großen Bereich in ASM kopiert ?



  • Nop. Ich glaube das kann man selbst mit Assembler nicht mehr sehr viel schneller machen, als C... Es gibt nicht all zu viele Moeglichkeiten, Speicherbereiche zu kopieren... Ich koennte mir nur vorstellen, dass das Wechseln einiger Selectors dabei viel CPU-Zeit verbraucht...
    Trotzdem ein Bsp: (vieleicht hilfts noch irgendwie 😕 )
    (e)si=Quelloffset
    (e)di=Zieloffset
    (e)cx=4000 (64KB/4)
    rep movsd


Anmelden zum Antworten