2013-12-11 4 views
2

С точки зрения производительности я должен выбрать:Отражение :: hasMethod против method_exists производительность

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

Это

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

над

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

А почему?

Для этого случая я не использую никаких других свойств или методов ReflectionClass.

+0

Отражение всегда медленнее, чем некоторый собственный метод PHP для проверки того, определен ли метод. Не уверен, насколько это плохо в PHP, но в Java-отражении медленнее, чем ад ... И вы всегда можете сделать некоторую собственную отладку ... Сделайте две петли из 10000 повторений, в которых в первом цикле измеряют время для отражения и внутри во-вторых, измерьте время для 'method_exists' ... Затем сравните, и вы закончите ... – shadyyx

+3

Почему вы не просто измеряете, что быстрее? – Jon

+0

Для однократной проверки это избыток, используя ReflectionClass. Используйте его, когда вы делаете сложную проверку класса –

ответ

8

Я измерил его с 1 000 000 петель. Он может быть не репрезентативным.

Необходимые 21 секунд:

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

Необходимые 1.2 секунды:

method_exists($module, 'getDecryptedId') 

Так method_exists 17,5 раз быстрее. Это только интересно, если вы широко используете его.

+2

Может быть интересно, что - если вы уже получили контекст ReflectionClass в любом случае - hasMethod немного быстрее, чем method_exists: method_exists: 2.242s hasMethod: 1.806s (И для итераций 10kk с php 5.6.7 в бродячем vm) – masch

0

Я измерил несколько различных показателей:

  • настройки отражения вне цикла
  • где метод существует
  • где метод не существует
  • , где этот метод в родительском классе

Я сделал 500 000 циклов на моем MBB 2015 года, и результаты были очень похожи.

  • method_exists был около 3,4 - 3,5 секунды
  • hasMethod составлял около 3,7 - 3,8 секунды

Так нет большой разницы в зависимости от положения/существования метода, и отражение было немного медленнее, в 8%.

Если бы мне было нужно больше информации, то отражением было бы возможным, но для простой проверки у method_exists есть край.

+1

Можете ли вы поделиться своим кодом (например, gist?). Благодаря! – Steve

Смежные вопросы