Andreas Korthaus: Benchmark

Beitrag lesen

Hallo!

vielleicht nicht 100, aber mindestens 95% der Zeichen des Binärstrings müssen url-kodiert werden, bei base64 nur gut 3%!

Nein! - Bei Base64 sind es _immer_ 25% da kommt's gar nicht auf den Inhalt an...

Das habe ich falsch erklärt, der ursprüngliche String wird 33% länger - immer. Aber der Base64 String besteht nur zu ca. 3% aus Zeichn die ich noch mit urlencode bearbeiten muß, also wird er kaum noch länger, der binäre gz-String besteht fast nur aus sonderzeichen, da muß ich 95% aller Zeichen mit urlencode bearbeiten, so wird der Sting fast 3 mal so lang!

Nun, ich habe dann mal ein paar Test mit einem eigenen Datenbank-Dump gemacht, hat knapp 60 KB, aber die Ergebnisse sind nicht soooooo hilfreich, da alle Methoden im Millisekundebereich liegen, aber es kristallisiert sich eine Tendenz heraus.

Erstmal das Script für die Branchmarks:

function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
    }

$string = get_table_data($tabelle);
$compressed = gzcompress($string);
$data = base64_encode($compressed);

echo str_pad ("data-string: ",25).strlen($string)." bytes\n";
echo str_pad ("compressed string: ",25).strlen($compressed)." bytes\n";
echo str_pad ("base64-string: ",25).strlen($data)." bytes\n";
echo str_pad (""+" in base64-string: ",25).substr_count($data,"+")."\n";
echo str_pad (""/" in base64-string: ",25).substr_count($data,"/")."\n\n";

$time_start = getmicrotime();
$urlencode = urlencode($data);
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo str_pad ("Urlencode: ",20)."$time seconds\n";

$time_start = getmicrotime();
$from = array("/+/","///");
$to = array("%2B","%2F");
$regExp_1 = preg_replace($from,$to,$data);
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo str_pad ("1 regExp(perl): ",20)."$time seconds\n";

$time_start = getmicrotime();
$regExp_2 = preg_replace("/+/","%2B",$data);
$regExp_2 = preg_replace("///","%2F",$regExp_2);
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo str_pad ("2 regExp(perl): ",20)."$time seconds\n";

$time_start = getmicrotime();
$from = array("+","/");
$to = array("%2B","%2F");
$regExp_3 = ereg_replace($from,$to,$data);
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo str_pad ("1 regExp(posix): ",20)."$time seconds\n";

$time_start = getmicrotime();
$regExp_4 = ereg_replace("+","%2B",$data);
$regExp_4 = ereg_replace("/","%2F",$regExp_4);
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo str_pad ("2 regExp(posix): ",20)."$time seconds\n";

$time_start = getmicrotime();
$implode = implode("%2B",explode("+",$data));
$implode = implode("%2F",explode("/",$implode));
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo str_pad ("Explode-Implode: ",20)."$time seconds\n";

Ein typischer Ergebnis:

data-string:             57877 bytes
compressed string:       7036 bytes
base64-string:           9384 bytes
"+" in base64-string:    142
"/" in base64-string:    147

Urlencode:          0.000187039375305 seconds
1 regExp(perl):     0.000286936759949 seconds
2 regExp(perl):     0.000213980674744 seconds
1 regExp(posix):    0.000173926353455 seconds
2 regExp(posix):    0.00799000263214 seconds
Explode-Implode:    0.00036096572876 seconds

So wie es aussieht ist urlencode schon das beste, was mich aber _sehr_ verwundert ist das Abschneiden der beiden POSIX Varianten, die ja angeblich deutlich langsamer sind als die PERL-Kompatiblen mit preg_

Aber die erste Variante ist die insgesamt schnellste! und die 2. dauert 50 mal so lange?!?!?! Wie kann das bitte sein? Vor allem ist das bei der PERL-Kompatiblen Variante genau umgekehrt, wenn auch nicht so ausgeprägt, aber die Tendenz bleibt bei allen Wiederholungen in etwa gleich!

Viele Grüße
Andreas