PHP魔术函数的性能测试

2009年9月24日 | 分类: 编程开发 | 标签: , , , ,

测试方法,新建一个名为User的PHP类,循环1000000次读取相关属性测试。 第一个测试,设置$username为私有方法,在循环内部生成类对象,使用__get获得其值

<?php
class User {
    private $username;
    public function __get($name) {
        return $this->$name;
    }
}
for ($i = 0; $i < 1000000; $i++) {
    $user = new User;
    $user->username;
}
?>
real    0m4.487s
user    0m4.192s
sys     0m0.291s

第二个测试,设置$username为公有方法,在循环内部生成类对象,直接获得其值

<?php
class User {
    public $username;
    public function __get($name) {
        return $this->$name;
    }
}
for ($i = 0; $i < 1000000; $i++) {
    $user = new User;
    $user->username;
} 
?>
real    0m1.403s
user    0m1.395s
sys     0m0.008s

第三个测试,设置$username为私有方法,在循环外部生成类对象,使用__get获得其值

<?php
class User {
    private $username;
    public function __get($name) {
        return $this->$name;
    }
}
$user = new User;
for ($i = 0; $i < 1000000; $i++) {
    $user->username;
} 
?>
real    0m2.677s
user    0m2.453s
sys     0m0.224s

第四个测试,设置$username为公有方法,在循环外部生成类对象,直接获得其值

<?php
class User {
    public $username;
    public function __get($name) {
        return $this->$name;
    }
} 
$user = new User;
for ($i = 0; $i < 1000000; $i++) {
    $user->username;
} 
?>
real    0m0.543s
user    0m0.537s
sys     0m0.007s

Book1_11472_image001

可见新建类操作与使用魔术方法都比较消耗资源,使用的时候一定要小心谨慎哦……

  1. 2009年9月24日08:56

    public和private都会调用__get()方法吗?

  2. 2009年9月24日09:03

    @kangzj
    public之后,由于$username属性可见,于是就不会再去调用__get()方法了。

  3. 2009年9月24日09:49

    @有颜色的猫
    我觉得也是,呵呵;直接访问肯定要快些吧