2017-11-22 3 views
7

Wegen einer Schulaufgabe muss ich einen C++ - Code in Assembly konvertieren (ARMv8). Dann muss ich den C++ Code mit GCC's -OO, -O1, -O2, -O3 und -Os Optimierungen kompilieren, die Zeit notieren und mit der Ausführungszeit meines Assembly Codes vergleichen. Ich glaube, ich weiß, dass -O3 schneller sein muss als -O1 und -O2. Allerdings bekomme ich, dass -O2 am schnellsten ist, dann sind -O1, -O3, -Os, -O0. Ist das normal? (Berechnete Zeiten sind ungefähr 30 Sekunden).Optimierte Ausführungszeit

+2

Mögliche Duplikat von [GCC: Unterschied zwischen -O3 und -Os] (https://StackOverflow.com/Questions/19689014/GCC-Difference-between-O3-and-OS) – Bilkokuya

+0

Ich sollte hinzufügen, dass während der Frage Ich habe geflaggt nicht speziell nach -O2 gefragt, es wird von der angenommenen Antwort dort geantwortet. – Bilkokuya

+2

Ihr Fragentitel bezieht sich auf die Kompilierungszeit, aber Ihr Fragetext scheint mehr über die Ausführungszeit besorgt zu sein, was nicht dasselbe ist. – lurker

Antwort

1

Ja, es ist üblich. Nehmen Sie die -Ox-Optimierung als Richtlinie. Im Durchschnitt produzieren sie Optimierung, die werben, aber eine Menge hängt von der Art, in der der Code geschrieben wird, Speicherlayout, sowie der Compiler selbst ab. Manchmal müssen Sie mehrmals versuchen und fehlschlagen, bevor Sie den optimalen Code erhalten. -O2 gibt tatsächlich die beste Optimierung in den meisten Fällen.

+0

Danke! Ich schaffte es, nur -O0 zu übergeben, wo mein Assembler-Code in 57s und -O1-3 in etwa 33s läuft. Es ist so gut? – Monstermania

+0

Ja, es ist so gut, und für die weitere Optimierung müssen Sie wahrscheinlich viel Zeit und Mühe aufwenden. C++ - Code ist normalerweise im Vergleich zu C-Code schwieriger zu optimieren. Wenn Sie können, können Sie versuchen, mit der Speicheroptimierung zu spielen, indem Sie die Größe von Stack und Heap ändern. Manchmal hilft es. – VladP

2

Beachten Sie, dass GCC viele andereoptimization flags hat.

Es kann nicht garantiert werden, dass -O3 schnellere Codes liefert als -O2; Ein Compiler kann mehr Optimierungs-Pässe anwenden, aber sie sind alle Heuristiken und könnten nicht erfolgreich sein (oder sogar Ihren Code etwas verlangsamen). Daher ist es möglich, dass -O3 einen etwas langsameren Code als -O2 (auf einigen insbesondere Eingangsquellcode) gibt.

Sie könnten eine neuere Version von GCC versuchen (die neueste - im November 2017 - ist GCC 7, GCC 8 wird in wenigen Monaten ausgehen). Sie können auch eine better-march= oder -mtune= Option versuchen.

Endlich mit Ihrem GCC plugin, könnten Sie Ihre eigene Optimierung Pass oder die Reihenfolge ändern (und die Menge) der angelegten Optimierung geht (es gibt mehrere hundert verschiedene Optimierungs geht in GCC) hinzuzufügen. Aber du wirst eine Menge Arbeit brauchen (vielleicht ein oder zwei Jahre), um GCC erweitern zu können.

Sie konnten die Optimierungsparameter einstellen, und einige Projekte (MILEPOST) haben sogar Maschinenlerntechniken verwendet, um sie zu verbessern.

Siehe auch Folien und Referenzen auf meine (alt) GCC MELT documentation.