In meinem Computer dauert dieser Code 17 Sekunden (1000 Millionen Mal):
static void Main(string[] args) {
var sw = new Stopwatch(); sw.Start();
int r;
for (int i = 1; i <= 100000000; i++) {
for (int j = 1; j <= 10; j++) {
MyDivRem (i,j, out r);
}
}
Console.WriteLine(sw.ElapsedMilliseconds);
}
static int MyDivRem(int dividend, int divisor, out int remainder) {
int quotient = dividend / divisor;
remainder = dividend - divisor * quotient;
return quotient;
}
während Math.DivRem 27 Sekunden dauert.
.NET Reflector gibt mir diesen Code für Math.DivRem:
public static int DivRem(int a, int b, out int result)
{
result = a % b;
return (a / b);
}
CIL
.method public hidebysig static int32 DivRem(int32 a, int32 b, [out] int32& result) cil managed
{
.maxstack 8
L_0000: ldarg.2
L_0001: ldarg.0
L_0002: ldarg.1
L_0003: rem
L_0004: stind.i4
L_0005: ldarg.0
L_0006: ldarg.1
L_0007: div
L_0008: ret
}
Theoretisch könnte es für Computer mit mehreren Kernen schneller sein, aber eigentlich sollte es überhaupt nicht notwendig sein, zwei Operationen durchzuführen, weil x86 CPUs sowohl den Quotienten als auch den Rest zurückgeben, wenn sie eine Ganzzahldivision mit DIV oder IDIV durchführen (http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_6/CH06-2.html#HEADING2-451)!
0 Stimmen
Was passiert, wenn Sie .NET auf Nicht-x86 ausführen?
0 Stimmen
X64 ist eine Erweiterung von x86 und wenn die CPU nicht kompatibel mit x86 ist, handelt es sich lediglich um die Verwendung eines anderen Codes für das .net-Framework für diese CPU
0 Stimmen
Richtig, aber .NET ist auch als Mono implementiert und sollte daher auf anderen Architekturen wie ppc usw. laufen.
4 Stimmen
Sie können das nicht sehen, indem Sie auf das IL schauen. Vielmehr müssen Sie sehen, was der JIT-Compiler tatsächlich produziert.
0 Stimmen
Omg, Ich kann es nicht glauben! Heute habe ich in meiner App festgestellt, dass das Aufrufen von DivRem etwas langsamer ist als einfach / und %. Nun habe ich deine DivRem-Funktion getestet und sie ist tatsächlich deutlich schneller als beide! (~20% auf meinem PC.)
0 Stimmen
DivRem behandelt negative Zahlen :)