Ich habe diese beiden Compiler in verschiedenen Projekten verwendet.
Wie unterscheiden sie sich in Bezug auf Code-Verarbeitung und Ausgabe-Generationen? Zum Beispiel haben sowohl gcc
als auch clang
-O2
Optionen für die Optimierung. Arbeiten sie in Bezug auf die Code-Optimierung auf die gleiche Weise (High-Level)? Ich habe einen kleinen Test gemacht, zum Beispiel wenn ich den folgenden Code habe:
Das Folgende sind die Ausgabebaugruppen mit clang und gcc mit -O2:
%Vor%Wie zu sehen ist, hat die Ausgabe unterschiedliche Anweisungen. Also meine Frage ist, hat einer von ihnen Vorteile gegenüber anderen in verschiedenen Projekten?
Ja. Und nein.
Das ist wie die Frage, ob ein Audi-Auto einen Vorteil gegenüber einem Mercedes hat. Wie sie sind die beiden Compiler zwei verschiedene Projekte, die dasselbe tun sollen. In einigen Fällen gibt gcc
besseren Code aus, in anderen Fällen clang
.
Wenn Sie wissen müssen, müssen Sie Ihren Code mit beiden kompilieren und dann messen.
In diesem Fall ist die Clang-Ausgabe besser, weil sie nicht verzweigt; Stattdessen lädt es den Wert von num % 2 == 1
in al
Der von gcc generierte Code verwendet Sprünge. Wenn num
erwartungsgemäß gerade / ungerade ist mit 50% Chancen und ohne sich wiederholende Muster, wird der von GCC erzeugte Code anfällig für Verzweigungsvorhersagefehler .
Sie können den Code aber auch gut in GCC machen, indem Sie
machen %Vor% Umso mehr, als es scheint, dass Ihr Algorithmus wirklich nur für vorzeichenlose Zahlen definiert ist, sollten Sie unsigned int
verwenden (sie unterscheiden sich für negative Zahlen) - tatsächlich erhalten Sie eine wesentliche Beschleunigung, indem Sie unsigned int
für die Argument, da nun GCC / Clang num % 2
auf num & 1
optimieren kann:
Der resultierende Code, der von gcc -O2
ist viel besser als der Code für Ihre ursprüngliche Funktion, die von beiden Compilern generiert wird. Ein Compiler ist also nicht so wichtig wie ein Programmierer, der weiß, was er tut.
Tags und Links optimization c gcc clang