[BraLUG] gcc performance

Wolfram Eifler c09 at weifler.de
Fr Jan 4 21:46:45 CET 2019


Moin, 

On Fri, 4 Jan 2019 11:19:37 +0100
Markus Dahms <mad at automagically.de> wrote:

> ist relativ unüblich, komplett ohne Optimierung zu kompilieren.
> Normalerweise nimmt man sowas wie "-O2" noch mit in die Optionen:
> 
> gcc -O2 -o counter counter.c
> 
> In dem Fall sorgt das aber dafür, das die Schleife komplett
> wegoptimiert wird, weil das Ergebnis schon zur Komplilierzeit
> feststeht.
> 
dagegen benutze ich meist sowas wie
  int main() 
  { 
       long i; 
       long j;
       j = 0;
       for (i = 0; i < 2000000000; i++) { 
         j += 3;
         if (j > 100000) {
           j = 0;
         }
       } 
       printf("Dummy ist %li \n", j);
  }
einfach in der Schleife komisch herumaddieren und ganz zum Schluss das
Ergebnis ausgeben - dann haut der Optimizer die Schleife nicht mehr
weg. 
Ich habe damit zwar nicht die Geschwindigkeit von String-Operationen
getestet, aber das kann man analog bauen (buchstaben an string-buffer
anhängen und buffer regelmässig zurücksetzen). 

Das obige Programm gibt auf meinem Gammel-Laptop mit 
	"gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
folgende Ergebnisse:
  gcc bla.c; time ./a.out	=> user	0m6.028s
  gcc -O bla.c; time ./a.out	=> user	0m3.020s
  gcc -O2 bla.c; time ./a.out	=> user	0m3.016s

Soweit ich weiss werden auch die Kernel-Sourcen mindestens mit -O
kompiliert. Wenn man von der Leistung "normaler" gcc-Kompilate auf
Kernel-Leistung rückschliessen will sollte man das tatsächlich auch
so machen. Andernfalls ist ein Fehler der Grössenordnung 50% drin
(Unterschied oben gcc versus gcc -O).

Eigentlich gab es für sowas irgendwo Compiler-Benchmarks, die die
verschiedenen Operationen (integer, float, string, pointer usw.)
durchprobieren.
Bei der Frage: Wie schnell läuft der Code aus Compiler X ist die Zeit
besser in die Suche nach einem geeigneten Benchmark investiert glaube
ich. Für einen groben Rückschluss auf Kernelgeschwindigkeit müsste man
dann noch wissen, in welchem Umfang der Kernel welche Operationen in
Anspruch nimmt. 

:) Wolfram

PS: Man kann das Detaillierungsspiel übrigens beliebig weitertreiben.
Welche Operationen der Kernel macht ist natürlich abhängig davon,
welche Art von Arbeit die betreffende Maschine verrichtet, wenn ich nur
Apfelmännchen rechne sind im Kernel weniger String-Operationen
unterwegs als bei einem Webserver.
Hier muss man selber einen willkürlichen Strich ziehen, wie genau man
es wissen will. Grundsatzregel ist meist: Ich betrachte nur
Operationsklassen, die mindestens 70% der Arbeitslast ausmachen. 



Mehr Informationen über die Mailingliste Bralug