2010-07-13 7 views
8

Ich arbeite an einer Math-Bibliothek für meine DirectX 3D-Engine in C#. Ich verwende SlimDX, eine wunderbar zusammengestellte und leistungsstarke Bibliothek. SlimDX bietet eine ganze Reihe von Mathe-Klassen, aber sie sind eigentlich Wrapper um native D3DX-Objekte. Obwohl die Objekte selbst sehr, sehr schnell sind, nehme ich nicht an, dass mein verwaltetes C# -Code besser abschneidet.Inline-Erweiterung in C#

Meine spezifische Frage hat mit Gleitkommavergleich zu tun. Die sorten kanonischer Weise ist eine epsilon-Wert, zu definieren und um den Wert der Differenz zwischen den Gleitkommawerten vergleichen Nähe zu bestimmen, etwa so:

float Epsilon = 1.0e-6f; 
bool FloatEq(float a, float b) 
{ 
    return Math.Abs(a - b) < Epsilon 
} 

Der Funktionsaufruf Overhead die Ist-Vergleich überschwemmen würden, Also würde diese triviale Funktion in C++ eingefügt werden, wird der C# -Compiler dies tun? Gibt es eine Möglichkeit, dem C# -Compiler mitzuteilen, dass eine Methode inline sein soll?

Antwort

7

Der C# -Compiler führt kein Inlining durch - aber das JIT kann dies in diesem Fall tun. Das ist sicherlich das Stück, das würde inlining durchführen, wenn überhaupt.

EDIT: Ich würde erwarten es in diesem Fall zu inline, aber es ist schwer zu sagen, ohne den Code in etwas wie cordbg mit JIT Optimierungen eingeschaltet. Jede andere CLR-Version kann durchaus verschiedene Verbesserungen an ihren Inlining-Einstellungen (einschließlich der 64-Bit- gegenüber den 32-Bit-CLRs) aufweisen, daher möchte ich nichts Bestimmtes sagen.

+1

Der JIT kann über inlining ziemlich intelligent sein, wenn außerhalb des Debugger ausführen. Es kann beispielsweise die 'Math.Abs'-Methode selbst inline einbinden. –

+0

Nun ist die Frage: Wird es in diesem Fall (unter der Annahme optimierten Code und kein Debugger)? – Mau

+0

@Mau: Bearbeiten ... –