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

php5:foreach的数组“复制”是否会产生开销?

  •  3
  • Don  · 技术社区  · 15 年前

    3 回复  |  直到 12 年前
        1
  •  3
  •   Don    15 年前

    Test This                    And This                       And, uh, This      
    ---------------------------  ----------------------------   ----------------------------
    Setup                        Setup                          Setup                     
    ---------------------------- ----------------------------   ----------------------------
    $i = array_fill(0,1000,'1'); $j = array_fill(0,1000,'1');   $j = array_fill(0,1000,'1');
    $c = 0;                      $d = 0;                        $e = 0;
    ---------------------------  ----------------------------   ---------------------------
    Code Under Test              Code Under Test                Code Under Test                    
    ---------------------------  ------------------------------ --------------------------
    foreach ($i as $v)           foreach (array_keys($j) as $k) foreach ($i as &$v)
    { $c+= $v; }                 { $d+= $j[$k]; }               { $e+= $v; }    
    ---------------------------  ------------------------------ -------------------------
    Tear Down                    Tear Down                      Tear Down                          
    ---------------------------  -----------------------------  -------------------------
    print "c = $c";             print "d = $d";                 print "e = $e";                    
    ---------------------------- -----------------------------  --------------------------
    Test for repetitions.  10000         
    ---------------------------- -----------------------------  -------------------------
    c = 10000000                 d = 10000000                   e = 10000000
    ---------------------------- -----------------------------  -------------------------
    Ran in  1.8540189266205      Ran in 4.0039160251617         Ran in 1.9633851051331
    ---------------------------  -----------------------------  -------------------------
    Winner -0.10936617851257     Looser 2.0405309200287         2nd Best             0
    ---------------------------  ----------------------------  -------------------------
    

    看起来foreach($a as$v)比array_键和使用&V在中间。

        2
  •  1
  •   scribble    15 年前

    PHP使用写时复制。通过引用传递要慢一些,因为它必须设置数据结构来维护引用。

        3
  •  1
  •   Don    15 年前

    Test This                                 And This                            
    ---------------------------------------   --------------------------------------
    Setup                                     Setup                               
    --------------------------------------    --------------------------------------
    $k = array_fill(0,1000,'1');              $i = array_fill(0,1000,'1');        
    $f = 0;                                   $c = 0;                             
    $kMax = count($k);                                                            
    --------------------------------------    --------------------------------------
    Code Under Test                           Code Under Test                     
    --------------------------------------    --------------------------------------
    for ($x = 0; $x < kiMax; $x++)            foreach ($i as $v)                  
    { $f+= $k[$x]; }                          { $c+= $v; }                        
    --------------------------------------    --------------------------------------
    Tear Down                                 Tear Down                           
    --------------------------------------    --------------------------------------
    print "f = $f";                           print "c = $c";                      
    --------------------------------------    --------------------------------------
    Test for repetitions:  10,000
    --------------------------------------    --------------------------------------
    f = 10000000                              c = 10000000
    --------------------------------------    --------------------------------------
    Ran in 2.8563051223755                    Ran in 1.8667521476746
    --------------------------------------    -------------------------------------
    2nd best      0.98955297470093            Winner               0