Я работаю над математической библиотекой для моего DirectX 3D механизм в C#. Я использую SlimDX, который является замечательно соединенной и мощной библиотекой. SlimDX обеспечивает довольно много математических классов, но они - на самом деле обертки вокруг собственных объектов D3DX, поэтому в то время как сами объекты очень, очень быстро, interop не, я предполагаю, потому что мой управляемый код C# превосходит их по характеристикам.
Мой конкретный вопрос имеет отношение к сравнению с плавающей точкой. Вид - канонического пути должен определить значение эпсилона и сравнить значение с различием между значениями с плавающей точкой для определения близости, как так:
float Epsilon = 1.0e-6f;
bool FloatEq(float a, float b)
{
return Math.Abs(a - b) < Epsilon
}
Вызов функции наверху затопил бы фактическое сравнение, таким образом, эта тривиальная функция будет встроена в C++, компилятор C# сделает это? Существует ли способ сказать компилятору C#, что я хочу встроенный метод?
Компилятор C # не выполняет встраивание, но JIT вполне может это сделать в этом случае. Это, безусловно, та часть, которая будет выполнять встраивание, если уж на то пошло.
РЕДАКТИРОВАТЬ: Я бы ожидал, что он будет встроен в этом случае, но трудно сказать, не загружая код во что-то вроде cordbg с включенной оптимизацией JIT. Каждая другая версия CLR может иметь разные настройки для встраивания (включая 64-битную и 32-битную CLR), поэтому я не хочу говорить что-либо слишком определенное.
Вот некоторая информация об обстоятельствах, при которых JIT не будет выполнять инлайнинг;
http://blogs.msdn.com/b/davidnotario/archive/2004/11/01/250398.aspx