Welche Konstrukte vermeiden?

Hi,

Um ein C-Proggi nicht zur fetten Bremse zu machen, gibt es bestimmt einige Konstrukte, die man niemals bauen sollte. Gibt es dazu eine FAQ oder sowas in der Richtung? Oder kennt jemand alles aussm Kopp?

Als Konstrukte meine ich solche Sachen wie eine switch-Anweisung
in einer switch-Anweisung in einer switch-Anweisung, wobei ich nicht weis ob das gerade schlimm ist.

Li

Hi!

Also eigentlich kann man schon ziemlich viele Sachen machen und das Programm wird nicht langsamer. Und wenn, dann wirklich nur so dass dus net merken wirst. Was man falsch machen kann? Hmm mal nachdenken… z.B. Makros kann man sehr geschickt einsetzen aber auch falsch.
Wenn du ne Funktion nimmst die du sehr oft benutzt im Code würde ich kein Makro nehmen obwohl du dann keinen „ausbremsenden“ Overhead hast.
Und es ist auch sehr fehleranfällig.
Switch in Switch ist ist nicht schlimm! Ich benutze das auch wenn ich mit der SDL arbeite. Da hat man dann 2 Schleifen ineinander und da drin noch 2 mal switch um den Tastendruck per polling abzufragen. Du „kannst“ es aber mit ner manuellen Assembler Optimierung verbessern obwohl ich nicht glaube dass das viele machen. Die Compiler könnnen das wohl besser =)
Tja, mehr kann ich da auch net zu sagen.
Zur Speicheroptimierung könnt ich noch was sagen aber das ist ja nicht direkt gefragt.

MfG
Pope

Eigentlich sind nur Scleifen in Schleifen (in Schleifen…) für die Performance gefährlich

Moritz
*dergernenpproblemeprogrammiert*

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Li,

Um ein C-Proggi nicht zur fetten Bremse zu machen, gibt es
bestimmt einige Konstrukte, die man niemals bauen sollte. Gibt
es dazu eine FAQ oder sowas in der Richtung? Oder kennt jemand
alles aussm Kopp?

Als Konstrukte meine ich solche Sachen wie eine
switch-Anweisung
in einer switch-Anweisung in einer switch-Anweisung, wobei ich
nicht weis ob das gerade schlimm ist.

switch:
Wenn die Case-Werte schön eine Reihenfolge bilden, also z.B. 3,4,5,6, dann erzeugen die meisten Compiler eine Sprungtabelle, was sehr schnell ist, andernfalls wird eine verschachtelte if … else if… Konstruktion erzeugt.

// sprungtabelle:
switch (i)
 {
 case 2: f2(); break;
 case 3: f3(); break;
 case 4: f4(); break;
 case 5: f5(); break;
 }

Erzeugter Pseudocode:

tabelle[4] = {LBL\_1, LBL\_2, LBL\_3, LBL\_4};
IF ((i \>= 2) AND (i 


Pointer und array:
Insbesondere in Schleiffen sin Pointer schneller als arrays:



    
    // schlecht
    int s[10];
    int i;
    for (i = 0; i s + sizeof(int) \* i;
    }
    Hier muss für jeden durchlauf eine Addition und eine multiplikation durchgeführt werden.
    
    
    // gut
    int s[10];
    int \*sp;
    int i;
    
    sp = s;
    for (i = 0; i s + sizeof(int)
    }
    
    Hier ist nur eine Addition pro Durchlauf nötig. Hinzu kommt noch das viele CPUs die Anweisung: Abspeichern und Incrementieren in einem eizigen Befehl ausführen können (PUSH und POP).
    




Mfg Peter(TOO)