类的定义如下:
复制代码代码如下:class test{public static function a(){}public function b(){}}$obj = new test;比较以下几种情况test::a();$obj->a();$obj->b();
测试代码:
复制代码代码如下:$obj = new test;$test_times = 100;$times = 10000;$effi1 = array();$effi2 = array();while ($test_times-- > 0){$time1 = microtime(true);for($i=0; $i{test::a();}$time2 = microtime(true);for($i=0; $i{$obj->a();}$time3 = microtime(true);for($i=0; $i{$obj->b();}$time4 = microtime(true);$effi1[] = ($time3 - $time2) / ($time2 - $time1);$effi2[] = ($time4 - $time3) / ($time3 - $time2);}echo avg($effi1),"\n",avg($effi2);最后的avg是自定义的计算平均数的一个函数:复制代码代码如下:function avg($arr){$result = 0;foreach ($arr as $val){$result += $val;}$result /= count($arr);return $result;}
程序输出结果:
复制代码代码如下:PHP 5.2.14 view sourceprint?1 0.76490628848091 2 1.0699484376399 view sourceprint?1 PHP 5.3 view sourceprint?1 0.56919482299058
1.1016495598611
重复执行N(N>10)次,都与这个结果相差不大,说明:1、直接通过类名访问静态方法的效率是通过实例访问静态方法的76%,甚至用PHP5.3时只有56% 2、通过实例访问静态方法的效率是访问非静态成员方法效率的106,在5.3版本变成110% 3、假设PHP从5.2升级到5.3时通过类名访问静态方法的效率没有降低,那么通过实例访问函数的效率至少提高了35%。我没看过PHP源码,有研究过PHP源码的朋友希望能告诉我这个假设是否成立 (我想应该是成立的)说明:以上测试基于windows 7和php.exe,5.2.14使用了apache2.2测试结果没有区别,考虑到php.exe和通过web访问所执行的PHP核心是一样的,所以5.3懒得改服务器配置了,结果应该一样。
