2010-07-13 5 views
8

Je travaille sur une bibliothèque mathématique pour mon moteur 3D DirectX en C#. J'utilise SlimDX, qui est une bibliothèque merveilleusement mise en place et puissante. SlimDX fournit pas mal de classes de maths, mais elles sont en fait des wrappers autour d'objets D3DX natifs, donc si les objets eux-mêmes sont très, très rapides, l'interop n'est pas supposé, car mon code C# géré les surpasse.Extension en ligne en C#

Ma question spécifique concerne la comparaison à virgule flottante. Le tri de manière canonique est de définir une valeur epsilon et comparer la valeur à la différence entre les valeurs à virgule flottante pour déterminer la proximité, comme ceci:

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

La fonction surcharge d'appel inonderaient la comparaison réelle, donc cette fonction triviale serait inline en C++, le compilateur C# fera-t-il cela? Est-il un moyen de dire au compilateur C# que je veux une méthode inline?

Répondre

7

Le compilateur C# n'effectue pas d'inlining - mais le JIT peut très bien le faire dans ce cas. C'est certainement la pièce que ferait effectuer inline, si quelque chose.

EDIT: Je voudrais attendre pour inline dans ce cas, mais il est difficile de dire sans charger le code dans quelque chose comme cordbg avec les optimisations JIT activées. Chaque version différente de CLR peut avoir des ajustements différents à son inlining (y compris les CLR 64 bits vs 32 bits) donc je suis réticent à dire quelque chose de trop définitif.

+1

Le JIT peut être assez intelligent sur inline, lorsqu'il est exécuté en dehors du débogueur. Il peut par exemple intégrer la méthode 'Math.Abs'. –

+0

Maintenant, la question est: va-t-il dans ce cas (en supposant un code optimisé et pas de débogueur)? – Mau

+0

@Mau: Modification ... –