Hallo Leute,
hat mich schon immer Interessiert, vielleicht hat jemand eine wirklich aussagekräftige Antwort:
Quizfrage:
Was ist während der Laufzeit schneller, eine Bedingung mit dem if keyword:
if (x == 1)
{
y = 2;
}
else
{
y = 3;
}
oder mit dem ? operator:
y = x ==1 ? 2 : 3;
Hallo CongoFX,
a) die Performance nimmt sich nichts
b) die Entscheidung für das eine oder andere Konstrukt sollte aus konzeptionellen Gründen getroffen werden, nicht aus Performance-Gründen.
herbivore
Hallo CongoFX!
Da muss ich herbivore rechtgeben.
Bei 10 Millionen Durchläufen ist die IF-Variante um nur 11 Millisekunden langsamer.
mfg
Hab solche Fragen nu schön öfters gesehen, da einen performancevergleich zu machen ist nicht sinnig da das eine nurmal ein konstrukt und das andere ein operator ist.
Die Operatorvariante benutze ich im quelltext selber gar nicht, weil es für mich einfach schwerer lesbar wird.
bei z.B.
Console.WriteLine("Zahl ist {0}",x>=5?1:0);
liegt für mich der einzige Sinn es mit ? zu machen 🙂
Interessant wäre mal, wie die beiden sich im MSIL unterscheiden ... bin da nur gerade zu faul für 😉
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Hallo Golo!
Hier sind die Codes:
static void TestIf(int x)
{
int y;
if (x == 1)
{
y = 2;
}
else
{
y = 3;
}
}
static void TestTri(int x)
{
int y;
y = x == 1 ? 2 : 3;
}
MSIL:
.method private hidebysig static void TestIf(int32 x) cil managed
{
// Code size 23 (0x17)
.maxstack 2
.locals init ([0] int32 y,
[1] bool CS$4$0000)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.1
IL_0003: ceq
IL_0005: ldc.i4.0
IL_0006: ceq
IL_0008: stloc.1
IL_0009: ldloc.1
IL_000a: brtrue.s IL_0012
IL_000c: nop
IL_000d: ldc.i4.2
IL_000e: stloc.0
IL_000f: nop
IL_0010: br.s IL_0016
IL_0012: nop
IL_0013: ldc.i4.3
IL_0014: stloc.0
IL_0015: nop
IL_0016: ret
} // end of method Program::TestIf
.method private hidebysig static void TestTri(int32 x) cil managed
{
// Code size 11 (0xb)
.maxstack 2
.locals init ([0] int32 y)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.1
IL_0003: beq.s IL_0008
IL_0005: ldc.i4.3
IL_0006: br.s IL_0009
IL_0008: ldc.i4.2
IL_0009: stloc.0
IL_000a: ret
} // end of method Program::TestTri
Ist aber nen langes If, noch mit zusätzlicher temporärer Variable, war Debug Code oder?
Im Release werden beide, sowohl if als auch trinärer Op zu:
L_0000: ldarg.1
L_0001: ldc.i4 500
L_0006: beq.s L_000b
L_0008: ldc.i4.s 100
L_000a: ret
L_000b: ldc.i4 200
L_0010: ret
kompiliert. Also einfach beide Parameter rauf aufn Stack, vergleichen und je nach Ergebniss den Rückgabewert aufn Stack Laden und zurückspringen aus der Funktion. Wobei ich hier auch 500 vergleichen hab, und 100, bzw. 200 die Rückgabewerte waren. Macht also keinen Unterschied was verwendet wird und wie Herbovire schon sagte
b) die Entscheidung für das eine oder andere Konstrukt sollte aus konzeptionellen Gründen getroffen werden, nicht aus Performance-Gründen.
Baka wa shinanakya naoranai.
Mein XING Profil.