为什么空的__set()方法比起作用的方法慢?
作者:互联网
我在玩弄PHP魔术方法(特别是Property overloading),并且在进行微基准测试时遇到了一个奇怪的问题,我无法解释:
似乎具有空主体的__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
有人对为什么会这样有解释吗?
解决方法:
哦,我认为这是错误的测试案例.
在第一个循环之后,NonEmptySetter将具有新的公共属性foo. next循环根本不调用__set方法,它们使用公共属性.
class NonEmptySetter {
public function __set($name, $value) {
echo 'called only once'; // would be echoed only once.
$this->{$name} = $value;
}
}
有效测试
class EmptySetter {
public function __set($name, $value) {}
}
class NonEmptySetter {
public function __set($name, $value) {
$this->{$name} = $value;
}
}
function benchmark($class_name) {
$start_time = microtime(TRUE);
for ($i = 0; $i < 1000000; $i++) {
$obj = new $class_name();
$obj->foo = 42;
}
return microtime(TRUE) - $start_time;
}
printf("NonEmptySetter: %.2f seconds\n", benchmark('NonEmptySetter'));
printf("EmptySetter: %.2f seconds\n", benchmark('EmptySetter'));
空的二传手更快.
标签:microbenchmark,magic-methods,php 来源: https://codeday.me/bug/20191029/1961661.html