Использование типов C # для выражения единиц измерения

Я пытаюсь получить то, что я называю системой единиц измерения, заключая double в структуру. У меня есть структуры 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.

Итак, мои вопросы (внимание!): почему код IA64, сгенерированный JIT, отличается для указанных выше случаев? Что можно сделать, чтобы структура работала так же быстро, как double? Кажется, нет теоретической разницы между double и Second, в чем заключается глубокая причина различия, которую я видел?

11
задан Ilya 11 November 2010 в 09:10
поделиться