2011-01-03 23 views
17

Ich bin sicher, es ist vernachlässigbar, aber da ich true zu einem booleschen Feld innerhalb einer Methode zuweisen möchten, macht diese Wahl einen Unterschied? Wenn ja warum?Leistung: Boolescher Wert immer zuweisen oder zuerst Wert prüfen?

field = true; // could already be true, but I don't care 

gegen

if(!field) field = true; 
+3

Ich stimme dir zu, ich bin mir sicher, dass es vernachlässigbar ist! Ernsthaft, aber eine viel interessantere Frage ist, welche klarer und einfacher zu pflegen ist. –

+1

und für Ihre eigentliche Frage werden die zwei verschiedenen Pfade in der Version mit dem if verschiedene Zeiten dauern, so dass Sie nicht wirklich antworten können, ohne die Wahrscheinlichkeit jedes Pfades zu kennen. Trotzdem würde ich kaum glauben, dass die unbedingte bedingungslose Aufgabe geschlagen werden würde. –

+0

Wenn ich ein solches Problem habe, benutze ich zuerst einen, der sich in diesem Fall um die Leistung kümmert, es ist deine Konvention. –

Antwort

15

würde ich nicht sagen. Aber das hängt von der Tatsache ab, dass wir wirklich über eine Feld im Gegensatz zu einer Eigenschaft sprechen, die Mai (obwohl es definitiv nicht sollte) zeigen unterschiedliche Verhalten in den zwei Schnipsel, die Sie enthalten (dh, wenn dort ist Logik mit Nebenwirkungen im Getter).

aktualisieren: Wenn Sie über Performance-Overhead zu sprechen sind, gibt es praktisch keine Differenz- aber Ich glaube Zuordnung ist immer so etwas weniger teuer (als den Wert zu lesen). Hier ist ein Beispielprogramm dies zu demonstrieren:

bool b = false; 

Stopwatch sw = Stopwatch.StartNew(); 
for (int i = 0; i < int.MaxValue; ++i) 
{ 
    b = true; 
} 
sw.Stop(); 

TimeSpan setNoCheckTime = sw.Elapsed; 

sw = Stopwatch.StartNew(); 
for (int i = 0; i < int.MaxValue; ++i) 
{ 
    // This part will never assign, as b will always be true. 
    if (!b) 
    { 
     b = true; 
    } 
} 
sw.Stop(); 

TimeSpan checkSetTime = sw.Elapsed; 

Console.WriteLine("Assignment: {0} ms", setNoCheckTime.TotalMilliseconds); 
Console.WriteLine("Read: {0} ms", checkSetTime.TotalMilliseconds); 

Ausgang auf meinem Rechner:

 
Assignment: 2749.6285 ms 
Read: 4543.0343 ms 
+0

Richtig, ich frage nur nach Feldern - hat die Zuweisung oder Wertüberprüfung einen höheren Aufwand?Eigenschaften sind eine andere Geschichte zusammen. Setter könnten leicht auch Overhead haben, wie zum Beispiel "Wert" gegen ein Feld zu vergleichen, Eigenschaftsänderungsbenachrichtigungen, etc. – Jay

+0

@Jay: OK, ich dachte durch "Unterschied" meintest du ein anderes * Verhalten *. Wenn wir über Overhead sprechen, scheint die Zuweisung (nach meinem eigenen Test) * etwas * weniger Overhead zu haben. Ich werde ein Beispielprogramm hinzufügen. –

+0

@Jay Sie vergleichen nicht die Zuordnung und die Wertprüfung: Sie vergleichen die Zuordnung und die Wertüberprüfung, möglicherweise gefolgt von der Zuweisung. –

10

Für ein Feld, nur um es einzustellen. Für eine Eigenschaft könnte es komplexer sein, abhängig davon, ob die get oder set unverhältnismäßig teuer ist, und/oder ob die set dies intern prüft (Ereignisse umgehen usw.).

Als allgemeine Regel für Eigenschaften, einfach festlegen, bis Sie wissen, dass dies ein Problem aufgrund von Profiling ist.

Für Felder; Mach dir keine Sorgen darüber. Standard, nur zu setzen.

+1

Natürlich ist eine Eigenschaft, die eine beträchtliche Menge an Zeit zum "Setzen" benötigt (und nicht prüft, ob das redundant wäre), entweder eine WTF oder etwas sehr Seltenes mit sehr sehr gutem Grund. – delnan

0

Was ich normalerweise tue ist, wenn ich etwas anderes als den Standardwert für jede Art von Variable erwarte, stelle ich es auf etwas ein, das es normalerweise nicht wäre. Wenn sich der Wert nicht ändert, weiß ich, was zu erwarten ist und wie ich damit umgehen soll. Es wäre nicht wirklich auf Ihre Beispiele anwendbar, Ihre Frage ist vage, Ihre Beispiele erklären nicht, was Sie zu tun versuchen.

Ich stimme den Aussagen von Marc und Dan natürlich zu.

4

In den 90er Jahren, als ich in x86 Assembler programmiert habe, war die Regel (IIRC) um Sprünge zu vermeiden. Eine if-Anweisung wäre als Sprung implementiert worden.

So würde meine Schlussfolgerung (unter dem assumtion, dass zumindest einige jener alten Regeln gelten immer noch), dass die if zu vermeiden und die Zuweisung direkt performanter sein würde.