代码之家  ›  专栏  ›  技术社区  ›  nerkn

php中的继承速度[关闭]

  •  2
  • nerkn  · 技术社区  · 14 年前

    我想知道在PHP中使用继承的速度代价是什么。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Gordon Haim Evgi    14 年前

    继承是OOP的关键元素。你不应该担心它可能对速度的影响。您可以(并且应该)喜欢组合和聚合而不是继承,但是如果您的设计需要继承,您可以使用它。其他任何事情都像是说你想不带球棒打棒球。继承是游戏的一部分。

    不管怎样,这里有一点要用您最喜欢的分析器运行:

    <?php error_reporting(-1); ini_set('memory_limit', '1024M');
    
    // Create classes A to Z with each class extending the previous class
    class A { public function fn() { return TRUE; } }
    $previous = 'A';
    foreach(range('B','Z') as $klass) {
        eval(sprintf('class %s extends %s{}', $klass, $previous));
        $previous = $klass;
    }
    
    // create results for non-inheriting class A
    function A_is_a()       { return is_a(new A, 'A'); }
    function A_get_class()  { return get_class(new A); }
    function A_get_parent() { return get_parent_class(new A); }
    function A_call_fn()    { $a = new A; return $a->fn(); }
    
    // create results for Z that inherits from Y ... that inherits from A
    function Z_is_a()       { return is_a(new Z, 'A'); }
    function Z_get_class()  { return get_class(new Z); }
    function Z_get_parent() { return get_parent_class(new Z); }
    function Z_call_fn()    { $z = new Z; return $z->fn(); }
    
    for($i=0;$i<10000;$i++) A_is_a();
    for($i=0;$i<10000;$i++) A_get_class();
    for($i=0;$i<10000;$i++) A_get_parent();
    for($i=0;$i<10000;$i++) A_call_fn();
    
    for($i=0;$i<10000;$i++) Z_is_a();
    for($i=0;$i<10000;$i++) Z_get_class();
    for($i=0;$i<10000;$i++) Z_get_parent();
    for($i=0;$i<10000;$i++) Z_call_fn();
    

    在我的计算机上使用php5.3.3 cli和zend调试器的结果

    Function     Calls  Av. Own   Own Time  Others    Total
    
    A_is_a       10000  0,000003  0,025626  0,000000  0,025626
    A_get_class  10000  0,000002  0,022033  0,000000  0,022033
    A_get_parent 10000  0,000002  0,020804  0,000000  0,020804
    A_call_fn    10000  0,000003  0,034949  0,012274  0,047223
    
    Z_is_a       10000  0,000002  0,024436  0,000000  0,024436
    Z_get_class  10000  0,000003  0,028833  0,000000  0,028833
    Z_get_parent 10000  0,000002  0,022144  0,000000  0,022144
    Z_call_fn    10000  0,000003  0,033359  0,012549  0,045908
    

    免责声明:请注意,结果可能在您的机器上有所不同,而且还请注意,孤立的基准通常都是无意义的,尤其是在类似这样的优化时。您可以将代码更改为扩展1000个类,然后您将看到 is_a 函数调用,但说真的,如果您的任何生产代码扩展了1000个类,则会遇到更大的问题;)

        2
  •  1
  •   Centurion    14 年前

    我认为在这种情况下,你不必关心速度,即使你必须扩展到1000个类。