Du bist hier: StartPHPBenchmarks › Arrayzugriff bei ObjektenDieses Snippet kommentieren

Arrayzugriff vs. direkte Methoden bei ArrayObjekt-Klassen

Dieser Benchmark prüft N mal, ob der Zugriff auf ein von ArrayObjekt abgeleitetes Objekt schneller ist, wenn man die Methoden (offsetGet bzw. offsetSet) oder die Arraysyntax nutzt. Das Ergebnis beim Durchlauf mit PHP 5.2.6 auf Vista x64:


Duration for array access (set) : 0.53046822547913 s
Duration for method access (set): 0.58158802986145 s
Duration for array access (get) : 0.43402695655823 s
Duration for method access (get): 0.50619602203369 s

Es zeigt sich also, dass der Arrayzugriff immer schneller ist. Und das ist auch gut so, darum implementieren wir ja den ganzen Kram ;-)

<?php

class MyArray extends ArrayObject {
    private $data;
    
    public function __construct() {
        $this->data['key1'] = 'value1';
    }
    
    public function offsetGet($index) {
        return $this->data[$index]; // isset($this->data[$index]) ? $this->data[$index] : null;
    }
    
    public function offsetSet($index, $value) {
        $this->data[$index] = $value;
        return $value;
    }
}

function randstr($len) { return substr(md5(uniqid()),0,$len); }

set_time_limit(0);

$maxRounds = 100000;
$arrayObj  = new MyArray();
$data      = array();
$f         = '';

for ( $i = 0; $i < $maxRounds; ++$i ) {
    $data[] = array(randstr(12), randstr(10));
}

$startArraySet = microtime(true);

for ( $i = 0; $i < $maxRounds; ++$i ) {
    $arrayObj[$data[$i][0]] = $data[$i][1];
}

$endArraySet = microtime(true);

for ( $i = 0; $i < $maxRounds; ++$i ) {
    $f = $arrayObj[$data[$i][0]];
}

$endArrayGet = microtime(true);

for ( $i = 0; $i < $maxRounds; ++$i ) {
    $arrayObj->offsetSet($data[$i][0], $data[$i][1]);
}

$endMethodSet = microtime(true);

for ( $i = 0; $i < $maxRounds; ++$i ) {
    $f = $arrayObj->offsetGet($data[$i][0]);
}

$endMethodGet = microtime(true);

echo "Duration for array access (set) : ".($endArraySet-$startArraySet)." s\n";
echo "Duration for method access (set): ".($endMethodSet-$endArrayGet)." s\n";

echo "Duration for array access (get) : ".($endArrayGet-$endArraySet)." s\n";
echo "Duration for method access (get): ".($endMethodGet-$endMethodSet)." s\n";

?>

Kommentar verfassen

Fehler gefunden? Doofer Code? Ein kleines "Danke!"? Hinterlasse einfach einen Kommentar.

(muss sein)
(muss nicht sein, wird nicht angezeigt)

Dein Kommentar wird erst nach einer manuellen Prüfung angezeigt.