2009-07-27 3 views
2

Bei Verwendung einer if() Aussage ist es aus Sicht der Leistung besser == oder zu verwenden =.NET 3.5/C#: Gibt es einen Unterschied in der Leistung zwischen if() == und =

if(object==null) 
!

oder

if(object!=null) 

Sollte die Aussage w/die höchsten Erfolgswahrscheinlichkeit in der if() Sequenz zuerst sein?

+1

tun Menschen Raum schneller mit ihrem rechten Daumen zu vergleichen mit dem linken Daumen –

+1

Aus Performance-Sicht getroffen, tut dies überhaupt keine Rolle. Aus der Sicht der Lesbarkeit könnte es sein. – Brian

+4

Der Versuch, Ihr Programm effizienter zu machen, indem Sie die Effizienz zwischen a == und! = Untersuchen, ist eine völlige Zeitverschwendung. Nur meine 0,02. – waqasahmed

Antwort

11

Ich analysierte nur den folgenden Code in .NET Reflector:

public static void Main(string[] args) 
{ 
    object obj2 = null; 
    if (obj2 == null) 
    { 
     Console.WriteLine("Is null"); 
    } 
    if (obj2 != null) 
    { 
     Console.WriteLine("Is not null"); 
    } 
} 

und hier ist die resultierende IL:

.method public hidebysig static void Main(string[] args) cil managed 
{ 
    .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() 
    .maxstack 1 
    .locals init (
     [0] object obj2) 
    L_0000: ldnull 
    L_0001: stloc.0 
    L_0002: ldloc.0 
    L_0003: brtrue.s L_000f 
    L_0005: ldstr "Is null" 
    L_000a: call void [mscorlib]System.Console::WriteLine(string) 
    L_000f: ldloc.0 
    L_0010: brfalse.s L_001c 
    L_0012: ldstr "Is not null" 
    L_0017: call void [mscorlib]System.Console::WriteLine(string) 
    L_001c: ret 
} 

Aus dem Vorstehenden scheint dass es für die Leistung keinen Unterschied macht, ob if() check you use. Aber Sie könnten es so sehen - versuchen Sie es mit der if() Prüfung, die am wahrscheinlichsten auftritt. Wenn also das Objekt am Punkt der if-Prüfung selten null ist, dann verwende if (object! = Null). +

+1

Ok, aber die IL wird nie ausgeführt, also sagt uns das nichts Endgültiges. Sie müssten den Maschinencode analysieren, der JIT kompiliert hat, und selbst dann würde es Ihnen nur über eine bestimmte Implementierung erzählen. Nach allem, was wir wissen, kann es bei 32-Bit-Prozessoren die gleiche Geschwindigkeit sein, bei 64-Bit-Prozessoren jedoch anders. –

1

Ich glaube nicht, dass es einen Unterschied in Bezug auf die Leistung macht. Ich ziehe es vor, den positiven Zustand zuerst immer zu testen - nennen Sie es den optimistischen Ansatz. Dadurch wird mein Code immer lesbarer (für mich).

10

Sie sollten sich nicht kümmern.

Wenn Sie sich mit Effizienz befassen, sollten Sie in einer niedrigen Sprache schreiben. Nicht .Net.

+0

Oh, starte dieses Argument nicht. Es gibt Fälle, in denen C# aufgrund von JIT-Optimierungen C++ übertrifft. –

23

Ich bezweifle sehr, dass Sie jemals einen spürbaren Unterschied bemerken würden; Nicht zuletzt gibt es brtrue und brfalse IL-Betreiber ...

Wenn Sie Performance-Probleme haben, einen Profiler verwenden, und schauen Sie sich echte Probleme; Das wird es nicht sein ... es ist eine vorzeitige Optimierung.

+2

Gut gesagt. Angesichts der Tatsache, dass keine wesentlichen Leistungsunterschiede bestehen, sollte das vorrangige Problem die Klarheit des Codes sein. –

+1

Es gibt keine Leistungsprobleme, ich versuche, wo möglich, proaktiv über die Optimierung zu sein. Diese Frage ist mir immer wieder eingefallen und ich dachte, es wäre hilfreich, eine gemeinsame Antwort zu bekommen. – ChrisP

+0

Ok, nun, jetzt hast du deine Antwort. –

2

Sollte die Aussage w/die höchste Erfolgswahrscheinlichkeit in der if() Sequenz zuerst sein?

Im Allgemeinen ja. Die Verwendung der Operatoren && und || in einem booleschen Ausdruck führt zu einer Kurzschlussauswertung - wenn die Auswertung des ersten Elements den Ausdruck unleugbar wahr macht, wird keiner der anderen Elemente ausgewertet.

Wie == vs !=, auch wenn es eine Leistungsdifferenz war, wird es nie einen Unterschied machen, dass Sie bemerken werden.

2

Ich würde sagen, es gäbe keinen Unterschied, wenn der Code der Form ist: -

if(obj == null) 
{ 
    // blah 
} 
else 
{ 
    // blah 
} 

Der Compiler wird Ihre if-Anweisung in eine Filiale übersetzen, entweder brtrue oder brfalse die gleichwertige Leistung.

Das klingt ein bisschen wie Sie sind Mikro-Optimierung; Wenn du fragen musst, dann bist du wahrscheinlich übereifrig.

Wenn Sie wirklich sicher sind, wird es ein Unterschied sein, versuchen, den Code zu schreiben beide Wege und Laufstoppuhren um den Code oder einen Profiler verwenden. Bis du es gemessen hast, ist es immer noch Theorie, und meistens ist unser Instinkt eher deplatziert, als wir über diese Dinge denken möchten!

0

Es sollte keinen Leistungsunterschied zwischen diesen geben.

Versuchen Sie, billige Vergleiche zuerst zu machen, wenn Sie sie mit && oder || verketten. Wegen Kurzschluss wird Ihr Programm die rechte Seite des Operators nicht bewerten, wenn die linke Seite bereits das Ergebnis bestimmt (das ist auch auf andere Weise praktisch).

Vergleichen von Referenzen ist viel einfacher für einen Computer als zum Beispiel Strings zu manipulieren. Wie Sie bereits vorgeschlagen haben, kann es nützlich sein, den am häufigsten auftretenden Fall zu verwenden.

Versuchen Sie jedoch, wenn möglich, die Lesbarkeit während der Optimierung nicht zu beeinträchtigen. Es ist schwer zu rechtfertigen, die Lesbarkeit für die Mikrooptimierung zu opfern.

Beispiel:

if (myString != null && myString.ToUpper() == "FOO") 
{ 
    // This works because of short circuiting. 
    // myString.ToUpper() will never be evaluated if myString is null. 
} 
0

Ich fange mit einer Warnung vor vorzeitiger Leistungsoptimierung an. Fokus auf Lesbarkeit.

Dazu gesagt, ich würde die IL von diesen erzeugt untersuchen. Das wird Ihnen sagen, wie viele Operationen jeder benötigt.

Ich war noch nie Systemprogrammierer, deshalb habe ich mich nie wirklich mit CPU-Leistungsoptimierung beschäftigt.

3

Ältere Prozessoren, die statische Vorhersage verwendeten, nahmen an, dass die Bedingungen beim Füllen ihrer Pipelines falsch waren. Ich glaube nicht, dass das relevant ist.

+0

Also, wenn es nicht mehr relevant ist, warum es erwähnen? –

+0

Weil er gefragt hat, ob es einen Leistungsunterschied zwischen der Verwendung von == und! = Gibt. Das kann etwas sein, aber unwahrscheinlich. –

3

Die 9 Nanosekunden, die Sie mit! = Statt! = Gewonnen hätten, gingen verloren, wenn Sie diese Frage stellten. Die Auswahl der Operatoren ist nicht von Bedeutung, und diese Arten von Mikrooptimierungen sollten nicht in das Design Ihrer Anwendung eingreifen.

Reihenfolge der ifs ist jedoch signifikant. C# & & und || Operatoren sind kurzgeschlossen, dh wenn die erste Bedingung eines & & falsch ist, dann wird C# die zweite Bedingung nicht bewerten - ebenso, wenn die erste Bedingung eines || ist wahr, dann hat es keinen Sinn, die zweite Bedingung zu bewerten.

Sie können einen Kurzschluss zu Ihrem Vorteil verwenden. Die Faustregel ist es, Bedingungen zu strukturieren wie folgt:

  • Wenn & mit &, Bedingungen höchstwahrscheinlich scheitern sollten an erster Stelle.
  • Bei Verwendung von || sollten die Bedingungen, die am wahrscheinlichsten zum Erfolg führen, an zweiter Stelle stehen.
  • Bedingungen, die sehr lange dauern, sollten als letzte ausgeführt werden.

ein triviales Beispiel verwenden:

if(existsInDatabase(username, password) && loginAttempts < 3) { ... } 

existsInDatabase eine lange Zeit ausführen dauern kann, könnte es eine Reise in die Datenbank oder einem Webservice erfordern.Wenn loginAttempts> = 3, haben wir eine Reise in die Datenbank verschwendet. Wir werden unsere Ausflüge in die Datenbank minimieren, indem sie den Code zu schreiben, wie folgt:

if(loginAttempts < 3 && existsInDatabase(username, password)) { ... } 

wenig zwickt wie dies manchmal einen großen Unterschied machen können, aber Sie wirklich brauchen, bevor sie diese Art von Änderungen zu profilieren. Wenn Sie 20 Entwicklerstunden damit verbringen, Ihren Code zu scannen und die Anweisungen für eine optimale Ausführung neu zu schreiben, aber Ihre Anwendung nur um 0,5 Sekunden beschleunigen, beträgt die Nettoeinsparung -19,99 Stunden. Berücksichtigen Sie dies, bevor Sie Ihre Anwendung optimieren.

-2

Als ich darüber nachzudenken, so etwas in meinem Code beginnen erinnere ich mich an die Linie von Robert Glass' Buch ‚Fakten und Irrtümer des Software Engineering‘

‚Effizienz ergibt sich mehr von gutem Design als eine gute Codierung.‘

Jeff einen Beitrag zu diesem Buch hat die Fakten und fallaices Auflistung: http://www.codinghorror.com/blog/archives/001083.html

Verwandte Themen