Какой самый эффективный способ разделить два целых значения и получить коэффициент с плавающей запятой в .NET? - PullRequest
1 голос
/ 12 ноября 2008

Рассмотрим следующую подпись в C #:

double Divide(int numerator, int denominator);

Есть ли разница в производительности между следующими реализациями?

return (double)numerator / denominator;

return numerator / (double)denominator;

return (double)numerator / (double)denominator;

Я предполагаю, что оба приведенных выше ответа дают один и тот же ответ.

Я пропустил какое-либо другое эквивалентное решение?

Ответы [ 2 ]

5 голосов
/ 12 ноября 2008

Вы пытались сравнить IL (например, с Reflector )?

static double A(int numerator, int denominator)
{ return (double)numerator / denominator; }

static double B(int numerator, int denominator)
{ return numerator / (double)denominator; }

static double C(int numerator, int denominator)
{ return (double)numerator / (double)denominator; }

Все три становятся (дать или взять имя):

.method private hidebysig static float64 A(int32 numerator, int32 denominator) cil managed
{
    .maxstack 8
    L_0000: ldarg.0 // pushes numerator onto the stack
    L_0001: conv.r8 // converts the value at the top of the stack to double
    L_0002: ldarg.1 // pushes denominator onto the stack
    L_0003: conv.r8 // converts the value at the top of the stack to double
    L_0004: div     // pops two values, divides, and pushes the result
    L_0005: ret     // pops the value from the top of the stack as the return value
}

Так нет: разница точно нулевая.

1 голос
/ 12 ноября 2008

Даже если вы используете VB.NET, числитель и знаменатель перед фактическим делением преобразуются в двойные, поэтому ваши примеры такие же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...