Welcher Algorithmus ist schneller für die Überprüfung, ob ein Bit gesetzt ist?

7

Ich mache ein Spiel, in dem ich viele Daten in einer Ganzzahl oder in einer langen speichern werde, weil ich eine riesige Menge an Daten haben werde. Ich möchte aus Leistungsgründen keine ganzen Klassen verwenden und sie werden nicht benötigt. Ich habe zwei Methoden gefunden, um ein Bit von einer Ganzzahl abzurufen. Ich habe mich gefragt, ob jemand weiß, welches ich verwenden soll oder welches schneller ist.

Die Methoden:

return (integer & (1 << bit)) != 0;

return (integer >> bit& 0x1) == 1;

    
Stas Jaro 10.09.2011, 20:22
quelle

3 Antworten

16

Es ist wahrscheinlich, dass das Bit, das Sie testen, "konstanter" ist als das, gegen das Sie testen. Daher können Sie Konstanten für das Bit erstellen, was bedeutet, dass Sie die Verschiebung nur einmal ausführen müssen. Zum Beispiel:

%Vor%

Dann überprüfen Sie in Ihrer Schleife

%Vor%

Sie machen also nur zwei Operationen (bitweise AND und vergleichen) in der Schleife, nicht drei (shift, AND und compare).

Und was noch wichtiger ist (wie in den Kommentaren erwähnt), als die Geschwindigkeitssteigerung, macht es auch viel klarer, wofür Sie jedes Bit verwenden, so dass der Code leichter zu lesen ist.

    
Paul Tomblin 10.09.2011, 20:28
quelle
5

Dies ist implementierungsabhängig und hängt von Ihrer Hardware und Ihrem Compiler ab. Ohne tatsächlich Zeitfahren zu fahren, glaube ich nicht, dass irgendjemand sagen kann, was besser ist.

Außerdem würde ich mir über so etwas keine Sorgen machen, es sei denn, Sie haben handfeste Beweise dafür, dass dieser Code so zeitkritisch ist, dass Sie ihn optimieren müssen. Es wird wahrscheinlich nicht produktiv sein, solchen Mikrooptimierungscode wie diesen zu produktivieren, es sei denn, Sie wissen, dass es ein Leistungsengpass ist, und ich wäre sehr überrascht, wenn Sie nicht noch mehr Bonusleistung durch die Optimierung anderer Teile des Codes erzielen könnten. Versuchen Sie, den Code zu profilieren, um die tatsächlichen Engpässe zu erkennen, und optimieren Sie dann diese Teile.

    
templatetypedef 10.09.2011 20:26
quelle
3

Es ist fast sicher kein Unterschied.

Aber der einzige Weg, sicher zu sein, ist für Ihre Plattform, beide zu profilieren. Sie müssen jedoch die Zeit für eine große Zahl in einer Schleife messen (wie 100e6), um Messfehler zu minimieren.

    
Oliver Charlesworth 10.09.2011 20:27
quelle