PHP类中Static方法效率测试代码

  类的定义如下:

  

复制代码 代码如下:

  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<$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是自定义的计算平均数的一个函数:

  

复制代码 代码如下:

  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<BR>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懒得改服务器配置了,结果应该一样。