Laden...

[gelöst] Quizfrage: was ist schneller "if" oder "?"

Erstellt von CongoFX vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.695 Views
CongoFX Themenstarter:in
63 Beiträge seit 2007
vor 16 Jahren
[gelöst] Quizfrage: was ist schneller "if" oder "?"

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;

49.485 Beiträge seit 2005
vor 16 Jahren

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

D
462 Beiträge seit 2005
vor 16 Jahren

Hallo CongoFX!

Da muss ich herbivore rechtgeben.
Bei 10 Millionen Durchläufen ist die IF-Variante um nur 11 Millisekunden langsamer.

mfg

998 Beiträge seit 2007
vor 16 Jahren

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 🙂

4.207 Beiträge seit 2003
vor 16 Jahren

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

www.goloroden.de
www.des-eisbaeren-blog.de

D
462 Beiträge seit 2005
vor 16 Jahren

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


6.862 Beiträge seit 2003
vor 16 Jahren

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.