PHP5.4 ist kurz vor der Beta, dass heißt die große Zeit der Neuvorstellungen ist erstmal vorbei, und solange ich nun darüber nachdenke, welchem Thema ich mir als Nächstes annehme, habe ich heute etwas Blog-Tuning betrieben. Das unsägliche Javascript der diversen Social-Bla sind statischen Links gewichen (und sowas). Statt 400kB sind es jetzt nur noch 250kB ohne und 25kB mit Cache.

Als kleine Brücke bis zum nächsten interessanten (?) Beitrag und damit Besucher ein Grund haben den ungeahnten Speed (und die Werbung hust :X) zu genießen, gibt es jetzt nur ein kleines Rätsel: Welches von Beiden ist schneller?

<?php
for ($i = 0; $i < = 1000000; $i++) {
    $array[$i] = $array[$i] * $array[$i];
    $array[$i] = base_convert($array[$i], 10, 16);
}
<?php
for ($i = 0; $i < 1000000; $i++) {
    $array[$i] = $array[$i] * $array[$i];
}

for ($i = 0; $i < 1000000; $i++) {
    $array[$i] = base_convert($array[$i], 10, 16);
}

Das ist etwas, was ich mir selbst immer wieder ins Gedächtnis rufen muss, denn die Antwort lautet: Keins von Beiden ist schneller. Die Details spare ich mir – wenn sie jemanden interessieren, kann ich sie nachreichen –, aber Fakt ist, dass beide Code-Schnippsel aus 2 Operationen/Funktionen bestehen, die jeweils 1000000 aufgerufen werden, und dagegen sind die Schleifen vollständig vernachlässigbar.

Aber warum ist das wichtig? Wichtig ist es in dem Sinne nicht, aber man hat nun kein Grund mehr Schleifen zu überladen, denn mit diesem Wissen kann man ohne schlechtem Gewissen mehrere Operationen auf den selben Datensatz auf mehrere Schleifen verteilen. Das gilt besonders dann, wenn man sich durch den Drang alles in eine Schleife zu komprimieren einiger nützlicher Techniken verwehrt.

<?php
$time = microtime(true);
$array = array_map(function ($item) {
    return base_convert(sqrt($item), 10, 16);
}, $array);
<?php
$time = microtime(true);
$array = array_map(function ($item) {
    return base_convert($item, 10, 16);
}, array_map('sqrt', $array));

Hier war bei mir die erste Variante tatsächlich rekonstruierbar geringfügig langsamer (nicht repräsentativ), obwohl die zweite Variante zwei Schleifen enthält (array_map() iteriert auch ;)). DIe Analyse, warum das so ist, habe ich mir gespart (ich weiß es also nicht). Es soll jetzt nur zeigen, dass gerade mit array_map() (und Konsorten) schöner und lesbarer Code möglich ist.