PHP7.0.7 中 SplObjectStorage 的性能有了很大提升。
SplObjectStorage
double(1.3110690116882)
[object_hash => value]
double(2.4147419929504)
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
SplObjectStorage::offsetGet — 返回与 对象 关联的数据
先前与存储中的 对象 关联的数据。
当 object
未找到时,抛出 UnexpectedValueException。
示例 #1 SplObjectStorage::offsetGet() 示例
<?php
$s = new SplObjectStorage;
$o1 = new stdClass;
$o2 = new stdClass;
$s[$o1] = "hello";
$s->attach($o2);
var_dump($s->offsetGet($o1)); // 等效于 $s[$o1]
var_dump($s->offsetGet($o2)); // 等效于 $s[$o2]
?>
上面的示例将输出类似于以下内容
string(5) "hello" NULL
PHP7.0.7 中 SplObjectStorage 的性能有了很大提升。
SplObjectStorage
double(1.3110690116882)
[object_hash => value]
double(2.4147419929504)
SplObjectStorage::offsetGet() 的速度会变得极其慢,具体取决于关联的数据(PHP 5.6)。
<?php
// SplObjectStorage
$object = new stdClass;
$test = new SplObjectStorage;
$test->attach($object, str_repeat("\0", 1024*1024));
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
$test->offsetGet($object);
}
var_dump(microtime(true) - $start); // 76 秒!
// 数组 + spl_object_hash()
$object = new stdClass;
$test = [];
$test[spl_object_hash($object)] = str_repeat("\0", 1024*1024);
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
$temp = $test[spl_object_hash($object)];
}
var_dump(microtime(true) - $start); // 0.3 秒