Hier ist ein erster Trick eure PHP-Programme etwas zu optimieren. Es ist nicht viel, aber wenn ihr diesen Trick in einer langen Schleife anwendet, kann doch die Performance um bis zu 57% erhöht werden. Der Trick ist ganz einfach. <strong>Bitshifting</strong>: Wenn ihr einen Wert durch 2 multiplizieren oder dividieren wollt, wird das der Anfänger mit dem a = a*b Ausdruck machen. Der Fortgeschrittene wird aber zu der wesentlich effizienteren Methode greifen. a = a « 1. D.h. die Zahl wird in ihrer Binärform um eins nach links verschoben. ( aus 0110 wird 01100, aus 1110 wird 11100 usw.). Oder für Menschen besser erklärbar. Es ist einfacher für uns eine Zahl mit 10 zu multiplizieren, als mit 9. 3456 * 10 = ?? Na klar 34560. Aber 3456 * 9 = ?? Es ist einfacher weil wir einfach nur eine Null ranhängen müssen. Für Computer, die im Binärsystem rechnen gilt das gleiche für Multiplikation mit 2. Leider kann der Computer nicht erkennen, ob wir bei a*b mit zwei oder mit irgend etwas anderem multiplizieren. Deswegen müssen wir ihm das explizit sagen. Er soll nicht multiplizieren, sondern nur verschieben. Mit dem BitShift Operator « und » (steht für die jeweilige Richtung) und insgesamt also a = a « b bedeutet A verschoben um b stellen nach («) links oder a multipliziert mit 2 hoch b.
<?php /********************** * BIT-Shifting Test * PHP 5.2 - 08/2008 ***********************/ $loops = 10000000; //TEST START $start = microtime(true); for($i = 0;$i < $loops;$i++) { $a = 123; $b = 255; //Time in Seconds secs $b = $b << 8; //2.15 //2.27 secs => 5,5 % slower //$b = $b * 256; //3.36 => 56,2 % slower //$b = ((((((($b << 1) << 1) << 1) << 1) << 1) << 1) << 1) << 1; //3.72 => 57,7 % slower //$b = $b * 2*2*2*2*2*2*2*2; $a += $b; } echo $b; //TEST END $end = microtime(true); echo "Test took ".($end-$start)." secs!"; ?>
Es hat mich nicht gewundert, dass Bitshifting über normale Multiplikation zeitlich siegt, aber der PHP Compiler ist verdammt schlecht. Normalerweise hätte er sehen müssen, dass 2*2*2*2… eine konstante Multiplikation ist, die sich zur Laufzeit nicht ändern wird und damit hätte er dies schon beim compilieren ausrechnen müssen.