Frage zu kurzem Assembler Code, Performance



  • Hi Assembler-Freaks 😃

    da ich leider kein plan von assembler habe, nur von c++ und vergleichbares...
    würde ich euch gerne fragen ob ihr ne idee hättet wie ich vielleicht diesen if vergleich schneller machen/gestalten könnte?? gibts da vielleicht irgend ne möglichkeit??
    vllt SSE(intel) oder so?
    curVal und result[3] sind beide short
    es geht um diesen bereich des codes:
    <<<<<<<<<<<..........
    c++ code: if (!(curVal^result[3]))
    0000000140011B77 movzx eax,word ptr [rbp+2F00h]
    0000000140011B7E movzx eax,ax
    0000000140011B81 movzx edx,word ptr [rbp+0Eh]
    0000000140011B85 movzx edx,dx
    0000000140011B88 xor eax,edx
    0000000140011B8A jne 0000000140011B93
    ...................>>>>>>>>>>>
    c++ code: counter[3]++;
    0000000140011B8C add dword ptr [rbp+2D70h],1

    vergleichbarer c++ code als gesamtes:
    if ((curVal == result[3]))
    counter[3]++;

    ich hoffe ich frage nicht nach etwas unmöglichem

    danke euch für eure zeit


  • Mod

    Darkst schrieb:

    ... würde ich euch gerne fragen ob ihr ne idee hättet wie ich vielleicht diesen if vergleich schneller machen/gestalten könnte??

    Dem Compiler sagen, dass er optimieren soll.



  • camper schrieb:

    Darkst schrieb:

    ... würde ich euch gerne fragen ob ihr ne idee hättet wie ich vielleicht diesen if vergleich schneller machen/gestalten könnte??

    Dem Compiler sagen, dass er optimieren soll.

    ist ja das problem, habe schon so einiges an optimierungen probiert etc..
    mit intel compiler bishin zum msvc++ compiler, jegliche optionen probiert, bringt meist keinen geschwindigkeitsvorteil
    es sind nunmal 300.000.000 schleifendurchläufe, da haut eine if abfrage gewaltig rein


  • Mod

    Darkst schrieb:

    camper schrieb:

    Darkst schrieb:

    ... würde ich euch gerne fragen ob ihr ne idee hättet wie ich vielleicht diesen if vergleich schneller machen/gestalten könnte??

    Dem Compiler sagen, dass er optimieren soll.

    ist ja das problem, habe schon so einiges an optimierungen probiert etc..
    mit intel compiler bishin zum msvc++ compiler, jegliche optionen probiert, bringt meist keinen geschwindigkeitsvorteil
    es sind nunmal 300.000.000 schleifendurchläufe, da haut eine if abfrage gewaltig rein

    Der gezeigte Code sieht nicht so aus, als ob er mit aktivierter Optimierung entstanden ist. Zudem ist es irrelevant, wie "schnell" dieses if-Statement ausgeführt wird - worauf du warten musst, ist die Beendigung der Schleife, mithin ist, wenn überhaupt, die gesamte Schleife zu optimieren. Das kann ggf. durch Einsatz von Assemblercode geschehen, sollte aber nur als letztes Mittel angesehen werden. Generell kann das nur zum Erfolg führen, wenn der der Compiler nicht optimalen Code erstellt und das passiert generell nur dann, wenn der Quellcode eine gewisse Komplexität erreicht. Daraus folgt im Umkehrschluss, dass der Einsatz von Assembler überhaupt nichts nützt, wenn er sich auf so elementare Einzelabschnitte beschränkt.



  • camper schrieb:

    Der gezeigte Code sieht nicht so aus, als ob er mit aktivierter Optimierung entstanden ist. Zudem ist es irrelevant, wie "schnell" dieses if-Statement ausgeführt wird - worauf du warten musst, ist die Beendigung der Schleife, mithin ist, wenn überhaupt, die gesamte Schleife zu optimieren. Das kann ggf. durch Einsatz von Assemblercode geschehen, sollte aber nur als letztes Mittel angesehen werden. Generell kann das nur zum Erfolg führen, wenn der der Compiler nicht optimalen Code erstellt und das passiert generell nur dann, wenn der Quellcode eine gewisse Komplexität erreicht. Daraus folgt im Umkehrschluss, dass der Einsatz von Assembler überhaupt nichts nützt, wenn er sich auf so elementare Einzelabschnitte beschränkt.

    okay danke für die erläuterung, muss mir wohl was ausdenken ;), was mich stört an der gesamten sache, ist dass ein einziges if statement den code 15x mal länger laufen lässt also ohne dieses einzelne if..... (obwohl davor schon 6x if im format x < b, steht)

    mfg


  • Mod

    Dann zeig ihn doch mal her, den Code der Schleife..



  • und bitte in [cpp] tags



  • versuch mal
    [cpp]
    counter[3]+=(curVal == result[3]);

    😉
    oder ein test und adc in assembler.
    ansonsten kann man das mit mmx einfach und schnell machen. wenn du mehr postest, z.b. die datentypen, kann man auch mehr sagen 😃



  • Der Tipp von rapso ist gut und sollte einiges bringen.
    Spart einen conditional branch, und die sind relativ teuer.
    (Vorausgesetzt der Compiler checkt dass er hier setcc/movcc verwenden kann, was aber zumindest der MSVC tut)


Anmelden zum Antworten