Reflection :: hasMethod vs. method_exists性能

时间:2013-12-11 11:07:42

标签: php

从性能的角度来看,我应该选择:

$className = 'Foobar';
$methodName = 'method';

$Reflected = new ReflectionClass($className);
$result = $Reflected->hasMethod($methodName);

$result = method_exists($className,$method);

为什么?

对于这种情况,我没有使用ReflectionClass的任何其他属性或方法。

2 个答案:

答案 0 :(得分:11)

我用1,000,000个循环测量它。它可能不具代表性。

需要21秒:

$reflector = new ReflectionClass($module);
$reflector->hasMethod('getDecryptedId'))

需要1.2秒:

method_exists($module, 'getDecryptedId')

所以 method_exists快17.5倍。如果你大量使用它,这只是间歇性的。

答案 1 :(得分:0)

我测量了一些不同的指标:

  • 在循环外设置反射
  • 方法存在
  • 该方法不存在
  • 该方法在父类

我在2015 MBP上做了500,000次循环,结果非常相似。

  • method_exists大概是3.4 - 3.5秒
  • hasMethod约为3.7 - 3.8秒

因此,根据方法的位置/存在,差异不大,反射稍慢,为8%。

如果我需要更多信息反映将是可行的方法,但对于简单的检查,method_exists有优势。