Leistung Ausdruck.Kompilieren vs Lambda, direkte vs. virtuelle Aufrufe
Ich bin gespannt, wie performant die Ausdruck.Kompilieren gegenüber lambda-Ausdrucks in den code und versus direkte Methode zum Einsatz, und auch die direkte Methodenaufrufe vs virtuelle Methodenaufrufe (pseudo-code):
var foo = new Foo();
var iFoo = (IFoo)foo;
foo.Bar();
iFoo.Bar();
(() => foo.Bar())();
(() => iFoo.Bar())();
Expression.Compile(foo, Foo.Bar)();
Expression.Compile(iFoo, IFoo.Bar)();
Expression.CompileToMethod(foo, Foo.Bar);
Expression.CompileToMethod(iFoo, IFoo.Bar);
MethodInfo.Invoke(foo, Foo.Bar);
MethodInfo.Invoke(iFoo, IFoo.Bar);
- Was meinst du mit "wie gut"? Sind Sie auf der Suche für die Ausführung der Leistung?
- Danke, geklärt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nicht finden, eine Antwort, also hier ist der performance-test:
Auf meinem laptop (Release-Modus, 64-bit, .NET 4.5.2) es ergibt sich:
Hoffe, das hilft.
Aufgeteilt werden kann, eine Frage zu 2 Fällen:
ExpressionTest.exe in Release Modus mit Optimierung (Standard-release-Einstellungen) .NET 4.5.2:
Sehen wir, dass die "Direct Call" in 4,5 mal schneller als "Virtual Call". Aber wie wir oben sehen können ist es kein Aufruf an alle sein. Bar-Methode wurde inlined.
ExpressionTest.exe in Release Modus ohne Optimierung .NET 4.5.2:
So, "Direct Call" ist etwa 3-4% schneller als "Virtual Call".
Ähnliche Frage:
Die Leistung der "direkten" virtuelle call vs. call-Schnittstelle in C#
Hinweis: im release-Modus keine Anrufe an alle im "Direct Call" der Fall.
CPU geht aus 00B531BC (mov eax ...) zu 00B531C8 (jl 00B531BC) nur.