C++Guns – RoboBlog

04.04.2011

Etwas über C, Assember und Performance

Filed under: Allgemein — Tags: , — Thomas @ 21:04

Angenommen, ihr habt folgenden Code

int main()
{

  int i = 0;
  for(; i < 255; i++)
  {
    if(i != 10)
      printf("a");
    else
      printf("b");
  }

  return 0;
}

Angenommen, man ändert if(i != 10) zu if(i == 10). Läuft der Code schneller? Bei diesem Beispiel: Nein.

Ich habe mir den erzeugten ASM Code ausgeben lassen (--save-temps) und die Anzahl der Vergleiche und Sprünge verglichen. Beide male jeweils zwei. Schaltet man nun die Compileroptimierung ein (-O3), ändert sich der Code gewaltig. Es gibt nun ein Vergleich und ein Sprung für den Fall wenn die Variable i gleich 10 ist und zwei Vergleiche und ein Sprung wenn sie ungleich 10 ist. Ändert man den Code nun entsprechend, bleibt das Ergebnis gleich.

Wer es nicht glaub kann ja gern selbst den ASM Code sich anschauen ;) Das gilt aber nur für exakt dieses Beispiel. Schaltet man nun irgendwelche andere Optimierungen ein, oder benutzt Arrays statt der Laufvariable i, sieht alles wieder anders aus.

Interessant wäre es mal selbst Assembler Code zu schreiben der diese Aufgabe mit möglichst wenig Vergleiche und Sprünge in der Summe über die gesamte Laufzeit bewältigt.

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

You must be logged in to post a comment.

Powered by WordPress