【发布时间】:2014-04-14 00:46:27
【问题描述】:
我正在玩弄 PHP 魔术方法(特别是 Property overloading),并且在进行微基准测试时遇到了一个我无法解释的怪癖:
似乎带有空主体的__set 方法的运行时间比运行有效的方法要多。下面的代码 sn-p 演示了这一点:
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
有人解释为什么会这样吗?
【问题讨论】:
-
这有关系吗?你曾经获得过 1000 万次连续访问吗?还有,你到底为什么要用空法?基准只有在应用于现实情况时才有意义。这是一个人为的例子。
-
@SverriM.Olsen,没关系,但很有趣:^)
-
@sectus 只有对 PHP 的 C 实现感兴趣时才会感兴趣。性能方面,只有当你使用空的魔法方法 1000 万次时才有用......(以及对我之前评论的更正:我的意思是说“对该方法的连续调用”。我不知道为什么我使用“连续访问” " 为例。)
-
@SverriM.Olsen,所以,这笔交易不在 PHP 的 C 实现中,它是错误的测试实现。
标签: php magic-methods microbenchmark