2008-09-10 8 views
6

Legen Sie normalerweise Ihren Compiler fest, um die maximale Geschwindigkeit oder die kleinste Code-Größe zu optimieren? oder konfigurieren Sie manuell einzelne Optimierungseinstellungen? Warum?Wie richten Sie normalerweise die Optimierungseinstellungen Ihres Compilers ein?

Ich stelle fest, die meisten der Zeit, die Menschen neigen dazu, nur Compiler-Optimierungseinstellungen auf ihre Standardzustand zu verlassen, die mit Visual C++ max Geschwindigkeit bedeutet. Ich hatte immer das Gefühl, dass die Standardeinstellungen mehr mit Benchmarks zu tun haben, die eher kleine Programme sind, die vollständig in den L2-Cache passen, als das, was für die Gesamtleistung am besten ist .

Antwort

6

Als Gentoo Benutzer habe ich einige Optimierungen auf dem gesamten Betriebssystem versucht und es gab endlose Diskussionen über die Gentoo forums darüber. Einige gute Flaggen für GCC finden Sie in der wiki.

Kurz gesagt, die Optimierung der Größe funktionierte am besten auf einem alten Pentium3-Laptop mit begrenztem RAM, aber auf meiner Haupt-Desktop-Maschine mit einem Core2Duo lieferte -O2 insgesamt bessere Ergebnisse.

Es gibt auch eine small script, wenn Sie an den x86 (32 Bit) spezifischen Flags interessiert sind, die am meisten optimiert sind.

Wenn Sie gcc verwenden und wollen wirklich eine bestimmte Anwendung zu optimieren, versuchen ACOVEA. Es führt eine Reihe von Benchmarks aus und kompiliert sie dann mit allen möglichen Kombinationen von Kompilierungsflags neu. Es ist ein Beispiel unter Verwendung von Huffman-Kodierung auf der Website (weniger ist besser):

A relative graph of fitnesses: 

    Acovea Best-of-the-Best: **************************************    (2.55366) 
    Acovea Common Options: *******************************************   (2.86788) 
         -O1: **********************************************  (3.0752) 
         -O2: ***********************************************  (3.12343) 
         -O3: ***********************************************  (3.1277) 
      -O3 -ffast-math: ************************************************** (3.31539) 
         -Os: *************************************************  (3.30573) 

(Beachten Sie, dass es -Os am ​​langsamsten auf diesem Opteron-System erwiesen.)

+1

Der erste Satz Ihrer Antwort erinnert mich an http://web.archive.org/web/20041230075641/http://www.funroll-loops.org/ –

0

Wir verwenden maximieren immer für eine optimale Geschwindigkeit, aber dann, den ganzen Code, den ich in C++ schreiben irgendwie mit bioinformatischen Algorithmen verwandt und Geschwindigkeit ist von entscheidender Bedeutung, während die Codegröße relativ klein ist.

0

Speicher sind jetzt Tage billig :) So kann es auf maximale Geschwindigkeit sinnvoll zu setzen Compiler-Einstellungen sein, wenn Sie mit Embedded-Systemen arbeiten. Natürlich hängt die Antwort von der konkreten Situation ab.

1

Für mich hängt es davon ab, welche Plattform ich verwende. Für einige eingebettete Plattformen oder wenn ich am Cell-Prozessor gearbeitet habe, gibt es Einschränkungen wie einen sehr kleinen Cache oder minimalen Platz für Code.

Ich benutze GCC und neigen dazu, es auf „-O2“ zu lassen, die die „sicherste“ Optimierungsstufe ist und begünstigt Geschwindigkeit eine minimale Größe über.

Ich würde sagen, es macht wahrscheinlich keinen großen Unterschied, es sei denn, Sie entwickeln für eine sehr leistungsstarke Anwendung, in diesem Fall sollten Sie wahrscheinlich die verschiedenen Optionen für Ihren speziellen Anwendungsfall vergleichen.

2

Ich ziehe es minimale Größe zu verwenden. Speicher kann billig sein, Cache ist nicht.

+3

Und Sie überprüfen, dass schneller Code produziert? –

+0

Wenn Sie sich nicht in einer Situation befinden, in der die Speicherkapazität zu hoch ist, führt die Optimierung der Größe oft zu schlechterer Leistung –

1

Microsoft liefert alle seine für die Größe optimierte C/C++ - Software aus. Nach dem Benchmarking haben sie herausgefunden, dass es tatsächlich eine bessere Geschwindigkeit gibt (aufgrund der Cache-Lokalität).

2

Abgesehen von der Tatsache, dass Cache-Lokalität wichtig ist (wie On Freund gesagt hat), ist ein anderes Ding, Microsoft zu machen, ihre Anwendung zu profilieren und herauszufinden, welche Code-Pfade während der ersten paar Sekunden des Starts ausgeführt werden. Danach geben sie diese Daten an den Compiler zurück und bitten ihn, die Teile, die während des Hochfahrens ausgeführt werden, zusammen zu schließen. Dies führt zu einer schnelleren Startzeit.

Ich glaube, dass diese Technik öffentlich in VS verfügbar ist, aber ich bin nicht 100% sicher.

1

Es gibt viele Arten der Optimierung ist die maximale Geschwindigkeit im Vergleich zu kleinem Code nur ein. In diesem Fall würde ich maximale Geschwindigkeit wählen, da die ausführbare Datei nur ein bisschen größer sein wird. Auf der anderen Seite könnten Sie Ihre Anwendung für einen bestimmten Prozessortyp optimieren. In einigen Fällen ist dies eine gute Idee (wenn Sie beabsichtigen, das Programm nur auf Ihrer Station auszuführen), aber in diesem Fall ist es wahrscheinlich, dass das Programm auf anderen Architekturen nicht funktioniert (zB: Sie kompilieren Ihr Programm auf einem Pentium 4 machine -> es wird wahrscheinlich nicht auf einem Pentium 3 funktionieren).

1

Erstellen Sie beide, Profil, wählen Sie, welche besser auf bestimmten Projekten und Hardware funktioniert.

Für leistungskritischen Code, das ist - sonst wählen Sie alle und nicht stören.

0

Dies hängt von der Anwendung Ihres Programms ab. Bei der Programmierung einer Anwendung zur Steuerung eines schnellen industriellen Prozesses wäre eine Optimierung auf Geschwindigkeit sinnvoll. Beim Programmieren einer Anwendung, die nur auf die Eingabe eines Benutzers reagieren muss, kann eine Optimierung der Größe sinnvoll sein. Das heißt, wenn Sie über die Größe Ihrer ausführbaren Datei besorgt sind.

0

Die Optimierung der Compilereinstellungen ist eine Optimierung. Nach dem Prinzip, dass "vorzeitige Optimierung die Wurzel allen Übels ist", kümmere ich mich nicht darum, bis das Programm in der Nähe seines endgültigen Versandzustandes ist und ich habe festgestellt, dass es nicht schnell genug ist - d. H. Fast nie.

Verwandte Themen