Vielleicht hilft die Wikipedia article auf Boolesche Algebra.
Der Vorschlag ist eine Mikro-Optimierung, die Makro in Eile drehen kann. Der Just-in-Time-Compiler erzeugt eine bedingte Verzweigung für die if() -Anweisung, zumindest die von Microsoft erstellten sind nicht schlau genug, um den Code selbst zu optimieren. Sie müssen einen Blick darauf werfen, ob der Monojitter einen besseren Job machen kann, wenn Sie sich den generierten Maschinencode ansehen. Typische Codegenerierung wie folgt aussieht:
if (someBoolVar) anotherBoolVar = true;
00007FFD989F3BB1 movzx eax,cl
00007FFD989F3BB4 test eax,eax
00007FFD989F3BB6 je 00007FFD989F3BBA // <=== here
00007FFD989F3BB8 mov dl,1
00007FFD989F3BBA etc...
Bedingte Verzweigungen wie der JE-Befehl in dem obigen Maschinencode sind mühsam zu einem modernen Prozessor, es stark auf der Pipeline angewiesen, um Code auszuführen zu machen schnell. Befehlsdecodierung und Micro-Ops-Generierung wird im Voraus durchgeführt. Auch eine große Sache für den Prefetcher, es versucht zu erraten, welche Speicherorte in den Caches verfügbar sein müssen, damit die Ausführungs-Engine nicht zum Stillstand kommt, wenn der Speicherinhalt benötigt wird.Der Speicher ist sehr, sehr langsam im Vergleich zur rohen Ausführungsgeschwindigkeit der Ausführungs-Engine des Prozessors.
Ein Prozessor hat einen Verzweigung Prädiktor, es verfolgt, ob die Verzweigung genommen wurde, wenn der Code zuvor ausgeführt wurde. Und nimmt an, dass sich der Zweig wieder genauso verhält. Wenn es falsch rät, muss die Pipeline geleert werden. Eine Menge Arbeit wird weggeworfen und der Prozessor wird stehen bleiben, während er wieder hochfährt. Zusätzliche Long-Ställe können auftreten, wenn der Prefetcher falsch geraten hat, hohe Chancen, dass es getan hat. Es gibt eine good SO post, die die Folgen einer falschen Vorhersage erklärt.
Mit der Booleschen Algebra wird die Verzweigung vermieden, es wird eine OR- oder AND-Anweisung erzeugt, sie nehmen einen einzigen Zyklus und können die Pipeline niemals leeren. Sicherlich eine Mikro-Optimierung, macht es nur Makro, wenn dieser Code innerhalb der ~ 10% Ihres Codes befindet, die die Geschwindigkeit Ihres Programms bestimmt. Die IDE wird nicht schlau genug sein, Ihnen zu sagen, ob das der Fall ist, nur ein Profiler kann Ihnen das zeigen.
Fwiw, es gibt mehr Mikro-Optimierungen wie diese, Programmierer neigen dazu, die & & und || zu verwenden Betreiber unangemessen. Das Kurzschließverhalten dieser Operatoren erfordert immer eine Verzweigung im Maschinencode. Dieses Verhalten wird nicht immer benötigt, normalerweise ist es nicht und die & und | Operator kann viel schneller Code generieren. Wenn der Operand der linken Seite schlecht vorhergesagt wird, kann der Code 500% langsamer werden.
Ich bin mir ziemlich sicher, dass der letzte sein sollte '& = ~ someBoolVar;' Sie vermissen die '~' –
Ihre IDE möchte, dass Sie weniger lesbaren Code schreiben. Ignoriere seinen Rat. –
'|' (oder), '&' (und) und '~' (nicht) und sind bitweise Operatoren, in diesem Fall kann es zu diesen einzeiligen Zuweisungen gekürzt werden. Lassen Sie die IDE Ihren Code nicht "korrigieren", wenn er Sie verwirrt :) –