Schnellste Möglichkeit für den Betrag einer Zahl?



  • Hallo,
    was ist am schnellsten wenn ich den Betrag von einer Zahl brauche? Mir fallen 3 Möglichkeiten ein.

    1.) Zahl mit -1 multiplizieren

    if(zahl < 0)
      zahl *= -1;
    

    2.) Der Zahl ihr negatives zuweisen

    if(zahl < 0)
      zahl = -zahl;
    

    3.) abs benutzen

    int betrag = abs(zahl);
    

    Es geht bei mir um eine zeitkritische Anwendung und ich muss an vielen Stellen den Betrag nehmen. Deswegen möchte ich diese Stellen bestmöglich optimieren. Mir ist auch schon in den Sinn gekommen das Vorzeichen-Bit zu verstellen aber da bin ich hängen geblieben.



  • vermutlich die abs-Funktion; aber das kann man nicht pauschal für alle möglichen Compiler behaupten. Im Zweifelsfall miß es doch einfach nach!



  • was ist mit unsigned?

    unsigned int zahl = 0;//naja das was es eben sein soll weiss ich ja nicht
    
    cout << zahl << endl;
    


  • was ist mit unsigned?

    Ja keine Ahnung. Was soll damit sein?

    Und was ist mit Hochhaus?



  • Also ich habs mal mit rdtsc nachgemessen. Auf meinem VC++ Version 6 ist die Erste Variante am schnellsten. rdtsc ist aber dummerweise Intelspezifisch.

    @Parapiler:
    Na das ist ja mal ein toller Vorschlag. Meinst du ich soll einfach auf unsigned casten. Na dann Halleluja... 🙄 😉



  • Original erstellt von <Anykey>:
    **Also ich habs mal mit rdtsc nachgemessen. Auf meinem VC++ Version 6 ist die Erste Variante am schnellsten. rdtsc ist aber dummerweise Intelspezifisch.
    **

    widerspricht meinen erfahrungen mit dem MSVC. kannste das messprogramm veröffentlichen?



  • nein nicht auf unsigned casten weiss gar nicht ob das geht... aber wie wäre es von anfang an ihn als unsigned int zu deklarieren? somit hast du immer den Betrag



  • rotfl klar dann kannst du ihm ja gleich vorschlagen einfach keine negativen zahlen zu benutzen 🙄



  • Original erstellt von Parapiler:
    nein nicht auf unsigned casten weiss gar nicht ob das geht... aber wie wäre es von anfang an ihn als unsigned int zu deklarieren? somit hast du immer den Betrag

    Jo, und dann baut er noch ne Fallunterscheidung ein, falls er dann doch mal die wirkliche Zahl braucht und nicht nur ihren Betrag :p .



  • das abs(wert) nicht schneller sein kann ist eigentlich klar, ich denk mal du hast im debug compiliert.

    da ist das sicher nicht inline
    also laandet da erst mal was auf dem Aufrufstack

    dann ist in dem call ja noch was zu tun

    int abs(int z)
    {
      if (z>=0)
      {
        return z;
      }
      return -z;
    }
    

    und das sind was mehr sachen zu machen



  • Original erstellt von b7f7:
    das abs(wert) nicht schneller sein kann ist eigentlich klar, ich denk mal du hast im debug compiliert.
    ...
    und das sind was mehr sachen zu machen

    ja, im debug-code.
    aber im release-code sehrt man auch leicht sachen wie
    cwd //vorzeichen von ax nach alles 32 bits von dx tun
    xor ax,dx //falls ax negativ war, 1-erkomplement von ax machen
    sub ax,dx //falls negativ, 2-erkomplement machen
    kann nicht glauben, daß drei so direkte assemblerbefehle lahmer sein können, also rumgespringe.



  • naja, aber das der compiler aus dem rest auch nocht optimalen code macht und das dadurch gleichwertig wird... ist doch auch moeglich, sogar anzunehmen.
    deswegen denk ich da wurden im debugmode wieder nicht aussagekraeftige messungen vorgenommen.



  • Original erstellt von <b7f7>:
    deswegen denk ich da wurden im debugmode wieder nicht aussagekraeftige messungen vorgenommen.

    jo. seh ich auch so. und da das messprogramm geheim bleibt, isses unglaubwürdig.



  • Lass dir doch mal von der msdev den Disaaaemblierten Code ausgeben. Dann wird es vielleicht aussagekräftiger.

    Roland



  • code.debug!=code.release
    da nuetzt es auch nich den asm zu beobachten.



  • Original erstellt von <b7f7>:
    code.debug!=code.release

    Stichwort: Optimierungen



  • volkard
    *******
    wie schauts mit dem FPU befehl FABS aus? sollte doch noch "besser" sein oder?

    bye

    tester



  • Original erstellt von TheTester:
    **volkard
    wie schauts mit dem FPU befehl FABS aus? sollte doch noch "besser" sein oder?
    **

    glaub ich auch nicht.



  • FABS ist für Fließkommazahlen.


Anmelden zum Antworten