Was ist die performante Art und Weise zwei ganzzahlige Werte zu teilen und einen Floating-Point-Quotienten in .NET zu erhalten?

StackOverflow https://stackoverflow.com/questions/283377

Frage

Betrachten Sie die folgende Signatur in C #:

double Divide(int numerator, int denominator);

Gibt es einen Unterschied in der Leistung zwischen den folgenden Implementierungen?

return (double)numerator / denominator;

return numerator / (double)denominator;

return (double)numerator / (double)denominator;

Ich gehe davon aus, dass beide der oben die gleiche Antwort zurück.

Habe ich eine andere gleichwertige Lösung verpasst?

War es hilfreich?

Lösung

Haben Sie versucht, die IL (zum Beispiel mit Reflector ) zu vergleichen?

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; }

Alle werden drei (oder geben Sie den Namen nehmen):

.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
}

So Nr.: Es gibt genau Null Differenz

Andere Tipps

Auch wenn Sie VB.NET verwenden, Zähler und Nenner werden verdoppelt umgewandelt, bevor die eigentliche Teilung zu tun, so dass Ihre Beispiele sind die gleichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top