我正在玩弄 PHP 魔术方法(特别是属性重载),并且在进行微基准测试时遇到了一个我无法解释的怪癖:
似乎__set
一个空主体的方法比一个有效的方法需要更多的时间来运行。下面的代码片段演示了这一点:
class EmptySetter {
public function __set($name, $value) {}
}
class NonEmptySetter {
public function __set($name, $value) {
$this->{$name} = $value;
}
}
function benchmark($obj) {
$start_time = microtime(TRUE);
for ($i = 0; $i < 10000000; $i++) {
$obj->foo = 42;
}
return microtime(TRUE) - $start_time;
}
printf("EmptySetter: %.2f seconds\n", benchmark(new EmptySetter));
printf("NonEmptySetter: %.2f seconds\n", benchmark(new NonEmptySetter));
// output (on my Core 2 Duo laptop):
// EmptySetter: 4.39 seconds
// NonEmptySetter: 1.28 seconds
有没有人解释为什么会这样?