Auf welcher Ebene C # -Compiler oder JIT den Anwendungscode optimieren?

8

Ich möchte diese Informationen kennen, um meine Code-Größe zu reduzieren, damit ich nicht meine Zeit verschwenden werde, Dinge zu optimieren, die durch Compiler oder JIT erledigt werden.

zum Beispiel:

Wenn wir annehmen, dass der Compiler den Aufruf der get-Funktion einer Eigenschaft inline absetzt, muss ich den Rückgabewert nicht in einer lokalen Variablen speichern, um den Funktionsaufruf zu vermeiden.

Ich möchte eine gute Referenz empfehlen, die beschreibt, was vor sich geht?

    
Ahmed Said 16.03.2009, 14:26
quelle

4 Antworten

18

Vielleicht möchten Sie sich diese Artikel ansehen:

JIT-Optimierungen - (Sasha Goldshtein - CodeProject)
Optimierungen: Inlining I (David Notario)
Jit Optimizations: Inlining II (David Notario)

Um ehrlich zu sein, sollten Sie sich nicht zu viel Gedanken über diese Ebene von Mikrodetails machen. Lassen Sie den Compiler / JIT'er darüber für Sie sorgen, es ist besser als Sie in fast allen Fällen. Lassen Sie sich nicht auf vorzeitige Optimierung aufhängen. Konzentrieren Sie sich darauf, dass Ihr Code funktioniert, und sorgen Sie sich später um Optimierungen, wenn (a) er nicht schnell genug läuft, (b) Sie Probleme mit der Größe haben.

    
Kev 16.03.2009, 14:51
quelle
17

Wenn Sie sich Sorgen um die Leistung machen, führen Sie einen Profiler aus. Dann den Code ändern. Die Chancen stehen gut, dass Sie in einer Million Jahren niemals 100% richtig raten werden, wenn die Zeit vergeht. Sie könnten das Timing von 0,02% ändern und die Methode verlassen, die 62% der Belastung ausmacht. Du könntest es auch noch schlimmer machen. Ohne einen Profiler und Beweise sind Sie blind.

Sie können nicht annehmen , dass der JIT einen Property-Getter inline einfügt. Es gibt viele Gründe dafür oder auch nicht; Größe des Methodenkörpers, virtuell, Wert gegen Referenztyp, Architektur, angehängter Debugger, etc.

"Hochziehen" hat immer noch einen Platz und kann immer noch Einsparungen erzielen, wenn der Code wiederholt in einer engen Schleife aufgerufen wird; zum Beispiel:

%Vor%

(vergessen Sie die for vs foreach -Debatte für das obige - das ist eine orthogonale Diskussion). Im oben genannten wird der "Aufzug" Leistung helfen. Aber um wirklich verwirrend zu sein - bei Arrays ist das Gegenteil der Fall, und es ist effizienter, nicht zu hissen:

%Vor%

Das JIT erkennt dies und entfernt die Begrenzungsüberprüfung (da Arrays feste Größe haben).

    
Marc Gravell 16.03.2009 14:38
quelle
1

Das sieht nach einer Art Mikrooptimierung aus, die Sie nicht betrachten sollten. Wenn ich mich nicht irre, hängt es von der Architektur und der Version der CLR ab, welche Art von Optimierung angewendet wird.

Wenn Ihre Methode so oft aufgerufen wird und Sie wirklich möchten, dass sie inline ist, können Sie sie selbst auf Kosten von Spaghetti-Code inline einbinden.

Ich würde empfehlen, Ihren Algorithmus zu analysieren. Wenn Sie eine Inline-Methode verwenden, können Sie keine Geschwindigkeit speichern, während ein besserer Algorithmus die Laufzeit von Stunden auf Sekunden reduzieren kann.

    
Davy Landman 16.03.2009 14:39
quelle
-1

Die leistungsstärkste Optimierung, die von einem JIT durchgeführt wird, ist typischerweise Inlining. Ein JIT kann sogar hunderte von Funktionen tief einbinden (ich habe diese Zahl für JikesRVM gehört). Sie fügen sogar Dinge inline hinzu, die nicht immer inline möglich sind, und führen sie später wieder aus, wenn sie dies benötigen (dynamische Optimierung genannt).

Ein schöner Überblick ist Ссылка .

Für Ihre spezifische Frage würde ich wahrscheinlich sagen, ob der fragliche Funktionsaufruf heiß ist.

    
Paul Biggar 27.07.2009 17:25
quelle