phpbar.de logo

Mailinglisten-Archive

[php] Sehr interessante Ausführungszeiten (war: base64_decode)

[php] Sehr interessante Ausführungszeiten (war: base64_decode)

Andreas Müller php at universalware.de
Don Mai 27 08:59:31 CEST 2004


Hallo zusammen,
bei meinem basteln an der eigenen base64_decode funktion habe ich ein paar
verschiedene implementierungen ausprobiert und dabei interessante Ergebnisse
erzielt:
Im Prinzip geht es darum aus einem Character eine Zahl (0..63) zu machen und
damit dann die Daten per Bitrotation etc. aus 6 Bit in 8 Bit zu wandeln.
Knackpunkt ist unter anderem die Umsetzung des Characters in die Zahl.

Variante 1:
-----------
$code64='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
...
$x=strpos($code64,$text{$i});
if (!($x===false)) {
  ...
}

Variante 2:
-----------
$code64=Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P
',

'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',

'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',

'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/');
$code64=array_flip($code64);
...
$ch=$text{$i};
if (array_key_exists($ch,$code64)) {
  $x=$code64[$ch];
  ...
}

Variante 3:
-----------
$x=ord($text{$i});
if (($x>=65) && ($x<=90)) {
  $x-=65;
} else
if (($x>=97) && ($x<=122)) {
  $x-=71;
} else
if (($x>=48) && ($x<=57)) {
  $x+=4;
} else
if ($x==43) {
  $x=62;
} else
if ($x==47) {
  $x=63;
} else {
  $x=-1;
}
if ($x>-1) {
  ...
}

Was glaubt ihr welche Variante schneller ist? Dazu muss man sagen in
Variante 1 und 2 die Strinzuweisung bzw. Array Erzeugung  und Flip nur
einmal ausgeführt wird und der Rest in Schleife für den gesamten Base64
Datenblock.

Bin mal gespannt was ihr tippt :-)

Gruß,
Andreas



php::bar PHP Wiki   -   Listenarchive