多维数组中访问元素的效率

时间:2012-07-11 00:45:30

标签: php multidimensional-array performance

我看不出为此找到答案,但这一直困扰着我。

在php(或任何语言)中使用多维数组时,您是否可以通过保存将多维数组的数组作为其单独的数组来提高效率和生产力直接从整个数组中访问那个“数组”元素?

例如,
    的print_r($ myArray的);

Array
(
   [2] => Array
      (
         [7.0] => Array
            (
               [0] => 1
               [1] => 23
            )

         [16.0] => Array
            (
               [0] => 4
               [1] => 28
            )
      )
   [5] => Array
      (
         [17.0] => Array
            (
               [0] => 1
               [1] => 3
            )
      )
)   

如果我需要 REPEATABLY 访问[16.0]的数组,那么将该条目保存为自己的数组会更好,直到我不再需要它,或者它是否更好直接访问它?

Option 1:
$tempArray=$myArray[2]["16.0"];
echo "Index=".$tempArray[0].";

Option 2:
echo "Index=".$myArray[2]["16.0"][0];


当然这只是一个很小的例子,但是如果(任意)$ array [。] [。] [ n ] [...]中的值被多次访问,那么值 n 取决于循环的索引,直接访问元素或将该数组(深层在数组的层上)保存为自己的数组并以此方式访问其值之间是否有任何区别?

2 个答案:

答案 0 :(得分:2)

如果查看为这些语句生成的字节码:

$tempArray=$myArray[2]["16.0"];        
echo $tempArray[0];        
    FETCH_DIM_R        $3      $myArray, 2        
    FETCH_DIM_R        $4      $3, '16.0'        
    ASSIGN                     $tempArray, $4        
    FETCH_DIM_R        $6      $tempArray, 0        
    ECHO               $6        

echo $myArray[2]["16.0"][0];        
    FETCH_DIM_R        $7      $myArray, 2        
    FETCH_DIM_R        $8      $7, '16.0'        
    FETCH_DIM_R        $9      $8, 0        
    ECHO               $9        

(我已重新格式化并删除了EXT_STMT标记)。您可以看到唯一的区别是$ tempArray的实际赋值。您可能认为数组赋值很昂贵。然而,PHP使用引用模型并执行惰性写时复制,因此它不是,并且无论数组大小如何,成本几乎相同。

(当然,除非在assignemt之后更改元素,否则$ tempArray不再与其原始切片相同,并且此时内存使用量会随着assign引发切片的克隆而跳转,因为引用需要分开。)

好的,如果您对切片进行了大量本地化的只读访问以保存重复的 FETCH_DIM_R 查找,那么这种方法可能是值得的(PHP编译完全没有重复使用索引的本地优化)。 然而,在更新时拍摄自己的机会非常重要。

为什么不使用循环microtime()memory_get_usage()

自行对此进行基准测试

答案 1 :(得分:1)

您可以通过使用for循环创建一个巨大的多维数组来轻松地自行测试,但在索引大型数组时,直接访问它通常会更快。

使用较小的阵列(约500件或更少),它不会产生明显的差异。