Inspiriert von diese Frage ,
Jetzt nur für Benutzer mit & gt; 10k Wiederholung
Ich habe den folgenden Code gefunden:
%Vor%Warum läuft die Java-Version fast 3x schneller als die C-Version? Was ich hier vermisse?
Dies wird unter Ubuntu 9.04 mit:
ausgeführtIntel® Pentium (R) M @ 1.73GHz
32 Bits
BEARBEITEN
Das ist erstaunlich. Mit der -O3-Option in C optimieren Sie die Schleife und die Verwendung von -server in Java tut das gleiche. Dies sind die "optimierten Zeiten". optimiert http://img196.imageshack.us/img196/6489/screenshot4rv.png
Ich erwarte, dass javac
auf eine höhere Optimierungsebene als Ihr C-Compiler voreingestellt ist. Wenn ich hier mit -O3
kompiliere, ist das C viel schneller:
C mit -O3
:
Dein Java-Programm:
%Vor%Einige weitere Details; Ohne Optimierung kompiliert das C zu:
%Vor% Bei optimierung ( -O3
) sieht das so aus:
Wie Sie sehen können, wurde die gesamte Schleife entfernt. javap -c Loop
gab mir diese Ausgabe für den Java-Bytecode:
Es scheint, dass die Schleife kompiliert ist, ich denke, dass etwas zur Laufzeit passiert, um das zu beschleunigen. (Wie andere bereits erwähnt haben, quetscht der JIT-Compiler die Schleife aus.)
Meine Vermutung ist, dass der JIT die leere Schleife optimiert.
Update: Der Java Performance Tuning-Artikel Follow up to Empty Loop Benchmark scheint dies zusammen mit dem anderen zu unterstützen Antworten hier, die darauf hinweisen, dass der C-Code auch optimiert werden muss, um einen sinnvollen Vergleich zu ermöglichen. Schlüsselzitat:
Hätte ich gewählt, den Client-Modus 1.4.1 JVM zu verwenden (Client ist der Standardmodus), würden die Schleifen nicht weg optimiert werden. Hätte ich mich für den C ++ - Compiler von Microsoft entschieden, würde die C-Version keine Zeit benötigen. Offensichtlich ist die Wahl des Compilers kritisch.
Es gibt einige Dinge, die Sie hier kontrollieren müssen:
Ich denke nicht, dass diese Frage wirklich eine Antwort hat; Es hängt von den Optimierungen ab, die beide Compiler durchführen. In diesem Fall erwarte ich entweder, wenn in einen ausreichenden Optimierungsaufwand gestoßen würde, würde die Schleife vollständig eliminieren, da i
niemals verwendet wird.
Optimierung - Sie fehlen zumindest das -O2
-Flag in der Befehlszeile gcc
.
Der Java-JIT-Compiler ist schlau genug, um die Schleife zu optimieren, während der C-Compiler anscheinend die meisten Optimierungen ausgeschaltet hat.
Sie vergleichen also wirklich die Zeit, um die Java-Maschine zu starten, mit der Zeit, die unoptimierter C-Code benötigt, um auf 2 Milliarden zu zählen.
Wenn Sie versuchen, einen Compiler dazu zu bringen, eine bestimmte Einheit oder, na ja, Benchmark der Arbeit zu machen, dann müssen Sie es täuschen, dass das Ergebnis der Arbeit tatsächlich verwendet wird.
Eine Möglichkeit besteht darin, eine Funktion in eine Datei zu schreiben, zu kompilieren und dann mit dem Setup aus einer anderen Datei aufzurufen. Kein Compiler kann vorhersehen, was in Zukunft kompiliert wird.
Ohne das ist es nur eine Art Wettbewerb zwischen Standard-Optimierungsstufen und hat keine nützliche Bedeutung.
Ihr Programm tut absolut nichts, das sagt nichts über die Leistung beider Sprachen aus. Das einzige, was es Ihnen sagt, ist, wenn Ihr Compiler das herausfinden kann und deshalb Ihr Programm komplett überspringt.
Um es "etwas" zu tun, müssten Sie jedes Inkrement auf stdout drucken. Wenn Sie nur das Endergebnis drucken, könnte ein guter Compiler Ihr Programm auf eine Anweisung optimieren, die nur dieses Ergebnis ausgibt und die gesamte "Berechnung" überspringt.
Tags und Links java c performance