2009-03-16 5 views
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.Auf welcher Ebene C# -Compiler oder JIT den Anwendungscode optimieren?

zum Beispiel:

, wenn wir die Compiler inline den Aufruf der get Funktion einer Eigenschaft annehmen, so dass ich Funktionsaufruf nicht den Rückgabewert in einer lokalen Variablen speichern muß, um zu vermeiden.

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

Antwort

18

Sie können einen Blick auf diese Artikel nehmen:

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

Um ehrlich zu sein, sollten Sie nicht zu viel über diese Ebene der Mikro-Detail besorgniserregend. 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 unter Premature Optimisation aufhängen.Konzentrieren Sie sich darauf, dass Ihr Code funktioniert, und machen Sie sich später Gedanken über Optimierungen, wenn (a) er nicht schnell genug läuft, (b) Sie Probleme mit der Größe haben.

17

Wenn Sie über die Leistung besorgt sind, führen Sie einen Profiler. Dann Änderungscode. 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 Profiler und Beweise sind Sie blind.


Sie können nicht davon ausgehen, , dass der JIT eine Eigenschaft Getter Inline wird. Es gibt viele Gründe dafür oder auch nicht; Größe des Methodenrumpfs, virtuell, Wert vs Referenztyp, Architektur, Debugger angeschlossen usw.

„Hebe“ noch einen Platz hat, und kann immer noch Einsparungen wenn der Code aufgerufen wird wiederholt in einer engen Schleife erreichen; zum Beispiel:

var count = list.Count; 
for(int i = 0 ; i < count ; i++) {...} 

(vergessen, die for vs foreach Debatte fr der oben - das ist eine orthogonale Diskussion). Im oben genannten wird der "Aufzug" Leistung helfen. Aber nur um wirklich verwirrend - mit Arrays, es ist das Gegenteil, und es ist effizienter zu nicht hissen es:

for(int i = 0 ; i < arr.Length ; i++) {...} 

Der JIT erkennt dies und entfernt die Grenzen Prüfung (als Arrays festgelegt ist Größe).

+0

Ich wusste nicht über diese letzte! Gut zu wissen, danke! – Groo

+0

Danke für Informationen, aber ich frage nach einer guten Referenz für diese Information –

+2

Mein Punkt ist, dass * keine * Referenz wird Ihnen wirklich dabei helfen. Ein ** Profiler ** wird es tun. –

1

Dies sieht wie eine 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 viel heißt, und Sie wirklich wollen es inline, können Sie es auf Kosten von Spaghetti Code inline es.

Ich würde empfehlen, Ihren Algorithmus zu analysieren, inline eine Methode spart nicht Größen der Geschwindigkeit, während ein besserer Algorithmus Ihre Laufzeit von Stunden auf Sekunden verringern kann.

-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 http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_4.html.

Für Ihre spezifische Frage würde ich wahrscheinlich sagen, wenn der betreffende Funktionsaufruf heißen ist.

Verwandte Themen