Я пытаюсь получить то, что я называю системой единиц измерения, обернув двойную структуру. У меня есть структуры С#, такие как Meter, Second, Degree и т.д. Моя первоначальная идея заключалась в том, что после того, как компилятор будет встроен в все, что у меня получилось бы так же, как если бы использовались double.
Мои явные и неявные операторы просты и понятны, а компилятор действительно встраивает их, но код с Meter и Second в 10 раз медленнее, чем тот же код, используя double.
Мой вопрос заключается в следующем: почему С# -компилятор не может сделать код, используя 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
}
Update:
Я не спрашивал, подходит ли структура. Он делает.
Я не спрашивал, будет ли код встроен. 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 отличается для вышеуказанных случаев? Что можно сделать, чтобы сделать структуру так быстро, как дважды? Кажется, нет никакой теоретической разницы между двойным и вторым, какова глубокая причина различий, которые я видел?