Я пытаюсь получить то, что я называю системой единиц измерения, обернув двойную структуру. У меня есть структуры C#, такие как Meter, Second, Degree и т. Д. Моя первоначальная идея заключалась в том, что после того, как компилятор будет встроен в все, что у меня получилось бы так же, как если бы были использованы double.Использование типов C# для выражения единиц измерения
Мои явные и неявные операторы просты и понятны, а компилятор действительно встраивает их, но код с метром и секундой в 10 раз медленнее, чем тот же код с использованием double.
Мой вопрос в том, почему C# компилятор не может сделать код, используя второй как оптимальный, как код с использованием 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 отличается для вышеуказанных случаев? Что можно сделать, чтобы сделать структуру так быстро, как дважды? Кажется, нет никакой теоретической разницы между двойным и вторым, какова глубокая причина различий, которые я видел?
- это оператор 'implicit' или' + '? –
Возможно, вам будет интересен этот вопрос: http://stackoverflow.com/questions/348853/units-of-measure-in-c-almost – Benjol
Я знаю, что вы используете C#, но вы считали F #? Он построил в статических единицах, проверяя, что это то, что вы, похоже, ищете. См. Http://stackoverflow.com/questions/40845/how-do-f-units-of-measure-work –