其他分享
首页 > 其他分享> > 为什么空的__set()方法比起作用的方法慢?

为什么空的__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'));

http://3v4l.org/gVtSq

空的二传手更快.

标签:microbenchmark,magic-methods,php
来源: https://codeday.me/bug/20191029/1961661.html