2013-12-11 94 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 (對於10.6k迭代而言,PHP 5.6.7在vagrant vm中) – masch

0

我測量幾個不同的指標:環路

  • 其中該方法存在外

    • 設置反射
    • 其中該方法不存在
    • 其中該方法是在
    • 父類

    我在2015年MBP上做了500,000次循環,結果非常相似。

    • method_exists約爲3.4 - 3.5秒
    • hasMethod約爲3.7 - 3.8秒

    所以沒有太大的差別依賴於位置的方法的/存在,以及反射是稍微慢一些,在8%。

    如果我需要更多的信息反思將是要走的路,但對於一個簡單的檢查,method_exists有優勢。

  • +1

    你能分享你的代碼嗎?(例如,要點?)。謝謝! – Steve