类的定义如下: <div class="codetitle"><a style="CURSOR: pointer" data="27228" class="copybut" id="copybut27228" onclick="doCopy('code27228')"> 代码如下:<div class="codebody" id="code27228"> class test { public static function a(){} public function b(){} } $obj = new test; 比较以下几种情况 test::a(); $obj->a(); $obj->b(); 测试代码: <div class="codetitle"><a style="CURSOR: pointer" data="18942" class="copybut" id="copybut18942" onclick="doCopy('code18942')"> 代码如下:<div class="codebody" id="code18942"> $obj = new test; $test_times = 100; $times = 10000; $effi1 = array(); $effi2 = array(); while ($test_times-- > 0) { $time1 = microtime(true); for($i=0; $i<$times; $i++) { test::a(); } $time2 = microtime(true); for($i=0; $i<$times; $i++) { $obj->a(); } $time3 = microtime(true); for($i=0; $i<$times; $i++) { $obj->b(); } $time4 = microtime(true); $effi1[] = ($time3 - $time2) / ($time2 - $time1); $effi2[] = ($time4 - $time3) / ($time3 - $time2); } echo avg($effi1),"n",avg($effi2); 最后的avg是自定义的计算平均数的一个函数: <div class="codetitle"><a style="CURSOR: pointer" data="96916" class="copybut" id="copybut96916" onclick="doCopy('code96916')"> 代码如下:<div class="codebody" id="code96916"> function avg($arr) { $result = 0; foreach ($arr as $val) { $result += $val; } $result /= count($arr); return $result; } 程序输出结果: <div class="codetitle"><a style="CURSOR: pointer" data="36437" class="copybut" id="copybut36437" onclick="doCopy('code36437')"> 代码如下:<div class="codebody" id="code36437"> 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懒得改服务器配置了,结果应该一样。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|