Der Martin: Klammersetzung (ich seh grad den Wald vor lauter Bäumen nicht)

Beitrag lesen

Hi,

(mysql_num_rows($result) %2 == 1)
vs.
(mysql_num_rows($result) & 1)

möglich, aber groß dürfte der Unterschied nicht sein.
Weiß nicht genau, in welchen Größenordnungen man da rechnen muss, ...

das kommt sehr darauf an, ob wir von einer interpretierten Sprache wie PHP ausgehen, oder von einer compilierten wie etwa C.

In einer compilierten Sprache, bei der das relevante Resultat am Ende reiner Maschinencode ist, müsste man direkt die CPU-Operation betrachten. Eine Bitmaskierung macht so ziemlich jede CPU in einem einzigen Taktzyklus (zusätzliche Zyklen zum Lesen der Instruktion mal nicht berücksichtigt). Eine Modulo-Operation, also letztendlich eine Division, wird zwar auf modernen CPUs auch mit einer einzigen Instruktion codiert, braucht aber deutlich mehr Taktzyklen (Faustregel: mindestens so viele, wie die Operanden Bits haben). Wir haben hier also einen Vorteil von beispielsweise 1:32 für die Bit-Operation. Wenn man das Drumherum, den Rest der Schleife, noch berücksichtigt, reduziert sich das Verhältnis etwas, die Bit-Operation behält aber die Nase vorn.
Nur: MERKT man das nachher wirklich? Ob so eine Schleife mit werweißwieviel Durchläufen 24ms oder 26.2ms braucht, fällt wohl nicht wirklich ins Gewicht. Also kann man mit gutem Gewissen die Schreibweise verwenden, die einem besser gefällt - zumal gute Compiler teils Integer-Divisionen oder Multiplikationen mit einer Zweierpotenz als Konstante automatisch zu einem Bit-Shift optimieren.

Bei einer interpretierten Sprache wie PHP ist der Unterschied der reinen Berechnung aufgrund des Interpreter-Overheads *viel* geringer, und wird noch weniger relevant, wenn man den restlichen Code der Schleife mit betrachtet.
Auch hier ist also das Fazit: Die beiden Varianten sind in der Performance nicht merklich verschieden (vielleicht messbar).

aber angenommen, der Performancegewinn betrage nur 0,1 ms pro Berechnung

Das ist bei heutigen Maschinen vermutlich schon viel zu hoch gegriffen.

Btw, erst kurz nachdem ich meinen Bitmaskierungs-Vorschlag gepostet hatte, Martin, habe ich in deiner Signatur gelesen, dass man nicht immer alles sagen soll, was man weiß. Hätte ich es früher gelesen, wäre mein Beitrag wohl nicht erschienen ;)

Warum das denn? Manche Dinge *sollten* einfach gesagt werden.

So long,
 Martin

--
F: Was ist schlimmer: Alzheimer oder Parkinson?
A: Parkinson. Lieber mal ein Bier vergessen zu zahlen, als eins verschütten.