Ich wette, ich könnte das selbst beantworten, wenn ich mehr über Tools zur Analyse des C # / JIT-Verhaltens wüsste.
Ich habe einfachen Code wie diesen:
private SqlMetaData[] meta;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private SqlMetaData[] Meta
{
get
{
return this.meta;
}
}
Wie Sie sehen können, setze ich AggressiveInlining, weil ich der Meinung bin, dass es inline sein sollte.
Meiner Ansicht nach. Es gibt keine Garantie dafür, dass das JIT es ansonsten inline setzen würde. Liege ich falsch?
Könnte so etwas die Leistung / Stabilität / irgendetwas beeinträchtigen?
c#
performance
meta-programming
Serge
quelle
quelle
Antworten:
Compiler sind intelligente Bestien. Normalerweise werden sie automatisch so viel Leistung wie möglich von jedem Ort aus herausholen, an dem sie können.
Der Versuch, den Compiler auszutricksen, macht normalerweise keinen großen Unterschied und birgt eine Menge Chancen auf Fehlzündungen. Durch Inlining wird Ihr Programm beispielsweise größer, da der Code überall dupliziert wird. Wenn Ihre Funktion an vielen Stellen im Code verwendet wird, kann dies nachteilig sein, wie unter @CodesInChaos erläutert. Wenn es offensichtlich ist, dass die Funktion eingebettet sein sollte, können Sie wetten, dass der Compiler dies tut.
Wenn Sie zögern, können Sie immer noch beides tun und vergleichen, ob es einen Leistungsgewinn gibt. Dies ist der einzig sichere Weg bis jetzt. Aber ich wette, der Unterschied wird vernachlässigbar sein, der Quellcode wird nur "lauter" sein.
quelle
struct
s als Parametern eingebunden - wo dies in vielen Fällen der Fall sein sollte und könnte. Neben dem Fehlen von Hunderten offensichtlicher Optimierungen, einschließlich, aber nicht beschränkt auf, das Vermeiden unnötiger Grenzüberprüfungen und Zuweisungen unter anderem.Sie haben Recht - es gibt keine Möglichkeit, zu garantieren, dass die Methode eingebettet ist - MSDN MethodImplOptions Enumeration , SO MethodImplOptions.AggressiveInlining vs TargetedPatchingOptOut .
Programmierer sind intelligenter als Compiler, aber wir arbeiten auf einer höheren Ebene und unsere Optimierungen sind Produkte der Arbeit eines Mannes - unserer eigenen. Jitter sieht, was während der Hinrichtung passiert. Es kann sowohl den Ausführungsfluss als auch den Code nach den Kenntnissen seiner Designer analysieren. Sie können Ihr Programm besser kennen, aber sie kennen die CLR besser. Und wer wird in seinen Optimierungen korrekter sein? Wir wissen es nicht genau.
Aus diesem Grund sollten Sie alle vorgenommenen Optimierungen testen. Auch wenn es sehr einfach ist. Beachten Sie auch, dass sich die Umgebung ändern kann und Ihre Optimierung oder Desoptimierung zu einem unerwarteten Ergebnis führen kann.
quelle
EDIT: Mir ist klar, dass meine Antwort die Frage nicht genau beantwortet hat, obwohl es keinen wirklichen Nachteil gibt, gibt es nach meinen Timing-Ergebnissen auch keinen wirklichen Vorteil. Die Differenz zwischen einem Inline-Eigenschafts-Getter und 500 Millionen Iterationen beträgt 0,002 Sekunden. Mein Testfall ist möglicherweise auch nicht 100% ig genau, da er eine Struktur verwendet, da der Jitter und das Inlining mit Strukturen einige Vorbehalte aufweisen.
Wie immer ist der einzige Weg, es wirklich zu wissen, einen Test zu schreiben und ihn herauszufinden. Hier sind meine Ergebnisse mit der folgenden Konfiguration:
Leeres Projekt mit folgenden Einstellungen:
Ergebnisse
Getestet mit diesem Code:
quelle
Compiler führen viele Optimierungen durch. Inlining ist eine davon, ob der Programmierer es wollte oder nicht. Zum Beispiel hat MethodImplOptions keine "Inline" -Option. Weil das Inlining vom Compiler bei Bedarf automatisch durchgeführt wird.
Viele andere Optimierungen werden vor allem dann durchgeführt, wenn sie über die Build-Optionen aktiviert werden. Andernfalls wird dies im "Release" -Modus ausgeführt. Aber diese Optimierungen sind sozusagen "für Sie gearbeitet, großartig! Nicht funktioniert, lassen Sie es" -Optimierungen und bieten normalerweise eine bessere Leistung.
ist nur ein Flag für den Compiler, dass hier eine Inlining-Operation wirklich gewünscht ist. Mehr Infos hier und hier
Zur Beantwortung Ihrer Frage;
Wahr. Keine Garantie; Weder C # hat eine Option "Inlining erzwingen".
In diesem Fall nein, wie unter Schreiben von verwalteten Hochleistungsanwendungen beschrieben: Ein Primer
quelle