Sie sind hier : sebastian1012.bplaced.net/ homepage-neu / kreuz-und-quer / tutorials-info-neuigkeiten-php / bitoperationen-heute-noch-aktuell.php

Bitoperationen – Heute noch aktuell?

Beim programmieren einer Onlinezeitung bin ich eher zufällig über Bitoperationen gestolpert. Bitoperationen sind mathematische Operationen , die früher in der hardwarenahen Programmierung eingesetzt wurden. Heute existieren diese Operatoren zwar noch in (fast) allen Programmiersprachen, aber kaum jemand verwendet sie noch. Deshalb untersuche ich, ob das an mangelnder Perfomance liegen könnte.

Welche Operationen untersuche ich

Ich untersuche nur: Schiebeoperationen, Inkrement und Dekrement

Schiebeoperationen:

Mit Schiebeoperationen können Multiplikation mit bzw. Division durch 2er-Potenzen effektiv berechnet werden.

echo 9 << 3; // 9*2^3 = 72 echo 72 >> 3; // 72/2^3 = 9

Inkrement und Dekrement

Mit Inkrement und Dekrement kann man zu einer Variable eins addieren bzw. subtrahieren.

Natürlich gibt es aber auch noch weitere Bitoperationen.

Mein Testscript:

$durchläufe=2000000;   echo '<h1>Verschiebeoperationen</h1><br />'; $t_ref=microtime(true); for ($x=1;$x<=$durchläufe;$x++)   {   $c=(9 * 8);	     } $t_ref=microtime(true)-$t_ref; echo 'Zeit "* 8": '.($t_ref).' s (100 %)<br />';flush();   $t1 = microtime(true); for ($x=1;$x<=$durchläufe;$x++)   {   $c=(9 << 3);	     } $t1=microtime(true)-$t1; echo 'Zeit "<< 3": '.($t1).' s ('.round(100/$t_ref*$t1).'%)<br />';flush(); echo '<br />';   $t_ref=microtime(true); for ($x=1;$x<=$durchläufe;$x++)   {   $c=(72 / 8);	     } $t_ref=microtime(true)-$t_ref; echo 'Zeit "/ 8": '.($t_ref).' s (100 %)<br />';flush();   $t1 = microtime(true); for ($x=1;$x<=$durchläufe;$x++)   {   $c=(72 >> 3);	     } $t1=microtime(true)-$t1; echo 'Zeit ">> 3": '.($t1).' s ('.round(100/$t_ref*$t1).'%)<br />';flush(); echo '<hr />';   echo '<h1>Inkrement</h1><br />'; $c=0; $t_ref=microtime(true); for ($x=1;$x<=$durchläufe;$x++)   {   $c=$c+1;	     } $t_ref=microtime(true)-$t_ref; echo 'Zeit "x=x+1": '.($t_ref).' s (100 %)<br />';flush();   $c=$durchläufe; $t1 = microtime(true); for ($x=1;$x<=$durchläufe;$x++)   {   $c++;	     } $t1=microtime(true)-$t1; echo 'Zeit "x++": '.($t1).' s ('.round(100/$t_ref*$t1).'%)<br />';flush(); echo '<hr />';   echo '<h1>Dekrement</h1><br />'; $c=0; $t_ref=microtime(true); for ($x=1;$x<=$durchläufe;$x++)   {   $c=$c+1;	     } $t_ref=microtime(true)-$t_ref; echo 'Zeit "x=x-1": '.($t_ref).' s (100 %)<br />';flush();   $c=$durchläufe; $t1 = microtime(true); for ($x=1;$x<=$durchläufe;$x++)   {   $c++;	     } $t1=microtime(true)-$t1; echo 'Zeit "x--": '.($t1).' s ('.round(100/$t_ref*$t1).'%)<br />';flush(); echo '<hr />';

Ergebnis

Bei mir sind die Zeitunterschiede bei Inkrement und Dekrement sehr gering (+-2%).
Die Unterschiede bei den Verschiebeoperationen sind bei mir aber zwischen 30 und 50% deutlich spürbar.

Was haltet ihr davon? Nutzt ihr heute noch Bitoperationen? Oder sind sie euch zu kompliziert?

Ergänzung von Jan Hoersch:
Habe grad die Frage durchgecheckt, ob das Vertauschen von Variabeln über Bitoperationen schneller ist 🙂
Nach ein Paar kleinen Durchläufen hab ich nun ein Ergebnis für das Vertauschen von Variabeln über Bitoperationen. Und ich kann schonmal sagen…es lohnt sich sowas von nicht.
Vorallem für größere Texte fangen die Bitoperationen an zu stottern und erschreckend große Zeiten auszugeben, wobei sich das normale Vertauschen über eine zusätzliche Temp-Variable fast nicht auf die Zeit auswirkt.
Für C kann ich bisher nichts sagen, aber in PHP lohnt es sich nicht.
Das angehängte Skript hat aus 10 Durchläufen einen Mittelwert errechnet, zusätzlich inkrementiert es die Anzahl der Buchstaben, die es zu vertauschen gilt. Aber die Zeiten und der Graph denke ich sprechen für sich selber 🙂

Das Skript hat diese Ausführungszeiten benötigt. Übersichtlich als Graph ausgegeben sieht das Ganze so aus:
Vergleich Variablentausch über Bitoperation
Vielen Dank an Jan für den kleinen Zusatztest!