- microtime: documentation ( source)
- number_format: documentation ( source)
<?php
class IteratorV1 implements Iterator
{
private $index;
public $table;
function __construct(SplFixedArray $table){
$this->table = $table;
$this->rewind();
}
function rewind(){
$this->index = -1;
$this->next();
}
function next(){
while(
++$this->index < $this->table->count() &&
$this->table->offsetGet($this->index) === NULL
);
}
function valid(){
return $this->index < $this->table->count();
}
function key(){
return $this->table->offsetGet($this->index)->uncommentMe;
}
function current(){
return $this->table->offsetGet($this->index)->uncommentMe;
}
}
class IteratorV2 implements Iterator
{
private $index;
private $array;
private $entry;
function __construct(SplFixedArray $array){
$this->array = $array;
$this->rewind();
}
function rewind(){
for(
$this->index = 0;
$this->index < $this->array->count();
$this->index++
){
$this->entry = $this->array->offsetGet($this->index);
if($this->entry !== NULL){ return; }
}
$this->entry = NULL;
}
function next(){
for(
$this->index++;
$this->index < $this->array->count();
$this->index++
){
$this->entry = $this->array->offsetGet($this->index);
if($this->entry !== NULL){ return; }
}
$this->entry = NULL;
}
function valid(){
return $this->entry !== NULL;
}
function key(){
return $this->entry->uncommentMe;
}
function current(){
return $this->entry->uncommentMe;
}
}
class Entry{ public $uncommentMe = 123; }
$array = new SplFixedArray(2 ** 18);
for($i = 0; $i < (2 ** 18) / 2; $i++){
$array->offsetSet($i * 2, new Entry);
}
echo "should be slower:\n";
$st = microtime(true);
foreach(new IteratorV1($array) as $key => $content){}
echo number_format(microtime(true) - $st, 10) . "s\n";
echo "should be faster:\n";
$st = microtime(true);
foreach(new IteratorV2($array) as $key => $content){}
echo number_format(microtime(true) - $st, 10) . "s\n";