Experten gesucht um Geschwindigkeit von C-Code zu beurteilen

  • Hallo!
    Sind hier vielleicht zufällig Informatik-Experten, die die Performance von Code beurteilen können?


    Es geht um eine Übung, bei der das kleine 1x1 in Tabellenform ausgegeben werden soll.
    Vorschlag 1:

    Code
    for (i = 1; i <= 10; i++)
    {
    printf("\n"); //Zeilen
    for (j = 1; j <= 10; j++)
    {
    printf("%4d",(i*j));
    }
    }


    Vorschlag 2:


    Die Frage wäre jetzt, welcher Code "effizienter" ist.
    Die Meinungen gehen da auseinander, weil if-Abfragen wohl im Vergleich zu for-Schleifen vergleichsweise ineffizient sind. Andererseits frage ich mich aber auch, ob nicht in jeder for-Schleife auch eine if-Abfrage durchgeführt wird. Andere Ansätze gehen zur Beurteilung der Anzahl der Code-Zeilen, aber auch das kann ja eigentlich kein Maßstab sein.
    Oder ist es vielleicht so, dass der Compiler eine for-Schleife intelligenter in Maschinencode übersetzen kann als eine While-Schleife mit integrierter if-Abfrage, so dass die (meiner Meinung nach logisch vorhandene) if-Abfrage bei jedem Schleifendurchlauf der for-Schleife ("Abbruchbedingung erfüllt?") im kompilierten Programm nicht mehr auftaucht?


    Vielleicht kann ja jemand, der schon etwas mehr Ahnung hat, Licht ins Dunkel bringen? :)


    Sebastian

  • Ueberleg' dir halt mal, was der Compiler bzw. die CPU letztendlich draus macht. Sowohl eine for- als auch eine while-Schleife bestehen ja letztendlich aus den gleichen Operationen:


    - Bedingung pruefen
    - Zaehler inkrementieren
    - Code ausfuehren


    Die for-Schleife ist lediglich eine andere Schreibweise.


    Was dagegen Zeit kosten koennte, waere die Modulo-Operation, sofern es dafuer keinen speziellen Opcode gibt.


    Addition und Multiplikation ist i.d.R. "billig", bedingte Spruenge bzw. Vergleichsoperationen auch. Division ist teuer.


    Letztendlich haengt es aber mehr vom Compiler ab, was nun effizient ist und was nicht. Erlaubst du loop unrolling, wird der gleiche Code einfach x-Mal hintereinander erzeugt. Spart die Schleifen, braucht mehr Platz in RAM und Cache.


    Was u.U. noch interessant sein kann: Vergleiche gegen 0 sind u.U. schneller, also koenntest du in der for-Schleife auch jeweils runterzaehlen. Ist die Reihenfolge der Ausgabe vorgeschrieben? Ansonsten muesstest du fuer die Ausgabe immer nochmal ne Subtraktion durchfuehren.


    Weiterer, entscheidenderer Faktor: Der Code sollte lesbar sein. Ist viel wichtiger, als auf Nanosekundenebene zu optimieren und dafuer Code zu schreiben, bei dem niemand mehr durchblickt.

  • imho ist Variante 1 schneller...
    bei Variante 2 wurde zwar die erste for-Schleife durch ein while ersetzt und die zweite for-Schleife durch eine selbst-konstruierte Schleife, jedoch lassen sich diese nicht so ohne weiteres vom Compiler optimieren (wie es bei den for-Schleifen der Fal ist)...


    des weiteren hast du durch deine Modulo-Rechnung zusätzlich noch eine weitere Rechenoperation...
    solltest du diese Modulo-Operation noch rausschmeißen, sollten die beiden Varianten (je nach Compiler-Optimierung) gleich schnell sein...



    cheers...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!