Unterschied zwischen clang und gcc [geschlossen]

8

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:

%Vor%

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?

    
Pooya 11.04.2016, 07:22
quelle

2 Antworten

14

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.

Es gibt ein Argument hier und etwas weniger verwandt hier .

    
Honza Remeš 11.04.2016, 07:51
quelle
10

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:

%Vor%

Der resultierende Code, der von gcc -O2

generiert wird %Vor%

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.

    
Antti Haapala 11.04.2016 07:50
quelle

Tags und Links