Я пытаюсь получить то, что я называю системой единиц измерения, помещая double в struct.У меня есть структуры C #, такие как Meter, Second, Degree и т. Д. Моя оригинальная идея заключалась в том, что после встраивания компилятора все будет иметь такую же производительность, как если бы использовались double.
Мои явные и неявные операторы просты иЭто просто, и компилятор действительно встроил их, но код с Meter и Second в 10 раз медленнее, чем тот же код с использованием double.
Мой вопрос таков: почему компилятор C # не может сделать код, использующий Second, оптимальным, каккод, использующий double, если он все равно встраивается?
Секунда определяется следующим образом:
struct Second
{
double _value; // no more fields.
public static Second operator + (Second left, Second right)
{
return left._value + right._value;
}
public static implicit Second operator (double value)
{
// This seems to be faster than having constructor :)
return new Second { _value = value };
}
// plenty of similar operators
}
Обновление:
Я не спрашивал, подходит ли здесь структура.Это так.
Я не спрашивал, будет ли код встроен.JIT делает это встроенным.
Я проверил операции сборки, выполняемые во время выполнения.Они были разными для такого кода:
var x = new double();
for (var i = 0; i < 1000000; i++)
{
x = x + 2;
// Many other simple operator calls here
}
и так:
var x = new Second();
for (var i = 0; i < 1000000; i++)
{
x = x + 2;
// Many other simple operator calls here
}
Не было никаких инструкций вызова при разборке, поэтому операции фактически были встроенными.И все же разница значительна.Тесты производительности показывают, что использование Second примерно в 10 раз медленнее, чем использование double.
Итак, мои вопросы (внимание!): Почему сгенерированный JIT код IA64 отличается для описанных выше случаев?Что можно сделать, чтобы структура работала так же быстро, как в два раза?Кажется, нет никакой теоретической разницы между двойным и вторым, в чем глубокая причина разницы, которую я видел?