2010-03-06 8 views
8

sehe Ich kann die Optimierung mit Profiler, Größe der ausführbaren Datei und Zeit für die Ausführung zu untersuchen.Wie man den optimierten Code in c

Ich kann das Ergebnis der Optimierung erhalten. Aber ich habe diese Fragen,

  • So erhalten Sie den optimierten C-Code.
  • Welcher Algorithmus oder Methode wird von C verwendet, um einen Code zu optimieren?

Vielen Dank im Voraus.

Antwort

11

können Sie eine Idee der Optimierung mit der Option -fdump-tree-optimized mit gcc bekommen. und Sie erhalten eine optimierte Datei. Sie können den Code nicht ausführen, aber mit diesem können Sie sich eine Vorstellung von der Optimierung machen. Vergessen Sie nicht, -O2 oder -O3 oder eine andere Ebene einzuschließen.

8

Normalerweise ist der Code nicht als C optimiert. Normalerweise werden Optimierungspässe ausgeführt, lange nachdem das C in eine Form von Zwischendarstellung umgewandelt wurde, die für einen Compiler einfacher im Arbeitsspeicher verwendet werden kann. Daher ist eine direkte Antwort auf Ihre Frage, dass der optimierte C-Code nie existiert.

+0

Ja, ich kann den Assembler-Code mit dem Befehl objdump -s erhalten. und wir können Assembly-Code mit Hilfe von cc-S – sganesh

+0

Aber wenn ich weiß, wie es ist, Optimierung zu tun, kann ich versuchen, meine eigene Optimierung implementieren – sganesh

+1

Optimierung der tatsächlichen C ist so ziemlich nicht möglich, auf eine sinnvolle Weise zu tun. Die meisten Arten von statischen Analysealgorithmen sind so ausgelegt, dass sie an einer Form von "drei Adressen" -Code arbeiten, die bereits von einem Compiler übersetzt wurden. Algorithmen sind einfacher zu schreiben, wenn die Daten, auf denen sie arbeiten, einfacher sind. Fang mit dem "Drachenbuch" an und arbeite dich von dort aus hoch. (http://en.wikipedia.org/wiki/Dragon_Book_(computer_science)) –

7

Ein C-Compiler produziert normalerweise in keiner Phase optimiertes C. Stattdessen wandelt der Compiler C in eine vereinfachte interne Darstellung um, und die meisten Compileroptimierungen werden unter one or more of those intermediate representations ausgeführt. Dann generiert der Compiler eine Assembly oder eine Binärdatei daraus.

Der nächste, den Sie erhalten können, ist wahrscheinlich eine Datei zu Assembly ohne Optimierung und erneut mit höchster Optimierung zu kompilieren und dann die Assembly-Ausgabe zu vergleichen. Sie müssen die Assemblersprache gut verstehen, um das zu tun. Wenn Sie gcc verwenden, lesen Sie über die -S- und -O-Schalter, wie Sie dies tun (oder nicht tun).

Wenn es Ihr Ziel ist, schneller Code zu schreiben, dann ist Ihre beste Wette, bessere C zu schreiben, indem Sie bessere Algorithmen und Datenstrukturen auf C-Ebene verwenden, indem Sie den Profiler sorgfältig verwenden.

Wenn Ihr Ziel nur ist, Optimierung zu verstehen, versuchen Sie Program Optimization und Compiler Optimization auf Wikipedia für einige allgemeine Informationen.

+0

+1 für die Überprüfung von Assembler. –

+0

Ich benutze nur gcc. Ich weiß über -S und -O1, 2,3 Ebenen Aber ich möchte die Methode kennen, um einen Code zu optimieren. Dann kann ich nur meine eigene Optimierung ausprobieren – sganesh

+1

@sganesh: Dann sollte die Frage sein: Wie kann ich anfangen, einen Code-Optimierer zu schreiben? Der Versuch, einen Reverse-Engineering durchzuführen, was andere Compiler tun, wird Ihnen nicht helfen. Wenn Sie das tun wollen, schauen Sie sich einfach ihren Quellcode an. –

-2

Wenn Sie Assembler verstehen, können Sie den Assembler generierten Code von Compiler überprüfen.

+0

Wahr - aber das hat wirklich nichts mit der OP-Frage zu tun ... ganz zu schweigen von der Antwort von Papageien Jessie Mikkikan, die 4 Minuten vor deiner war ... –

2

Wenn Sie GCC verwenden, verwenden Sie ein Argument, um den Code zu optimieren, und verwenden Sie --save-temps als Argument. Jeder, der C-Code sagt, ist nicht optimiert, wenn C mit GCC kompiliert wird. Schreiben Sie einen rekursiven Fibonacci-Sequenzgenerator in C und lesen Sie den vorverarbeiteten Code durch. Das oben erwähnte Argument speichert auch die generierte Assembly in dem Verzeichnis, aus dem GCC aufgerufen wird. Wenn Sie mit der Intel-Syntax-Assemblierung vertrauter sind, verwenden Sie -masm = intel ebenfalls als Argument.

+0

In gcc wird --save-temps verwendet, um die vorverarbeitete Datei zu speichern . Mit -E können wir diese Datei sehen. Aber die --save-temps werden diese Datei dauerhaft speichern. – sganesh

Verwandte Themen