Встроенное расширение в C # - PullRequest
8 голосов
/ 13 июля 2010

Я работаю над математической библиотекой для моего DirectX 3D-движка в C #. Я использую SlimDX, который представляет собой удивительно собранную и мощную библиотеку. SlimDX предоставляет довольно много математических классов, но они на самом деле являются обертками вокруг нативных объектов D3DX, поэтому, хотя сами объекты очень и очень быстрые, взаимодействие, я полагаю, не происходит, потому что мой управляемый код C # превосходит их.

Мой конкретный вопрос касается сравнения с плавающей точкой. Каноническим способом сортировки является определение значения эпсилона и сравнение его с разницей между значениями с плавающей запятой для определения близости, например:

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

Затраты на вызов функции затопят фактическое сравнение, поэтому эта тривиальная функция будет встроена в C ++, будет ли компилятор C # делать это? Есть ли способ сообщить компилятору C #, что я хочу встроенный метод?

Ответы [ 2 ]

7 голосов
/ 13 июля 2010

Компилятор C # не выполняет встраивание - но JIT вполне может сделать это в этом случае. Это, безусловно, кусок, который будет выполнять встраивание, если что-нибудь.

РЕДАКТИРОВАТЬ: я бы ожидал, что будет встроено в этом случае, но трудно сказать, не загружая код в нечто вроде cordbg с включенной JIT-оптимизацией. Каждая отдельная версия CLR может иметь свои настройки (включая 64-битные и 32-битные CLR), поэтому я не хочу говорить что-то слишком определенное.

1 голос
/ 13 июля 2010

Вот некоторая информация об обстоятельствах, при которых JIT не будет выполнять встраивание;

http://blogs.msdn.com/b/davidnotario/archive/2004/11/01/250398.aspx

...