0

これに対する答えを見つけることはできませんが、しばらくの間私を悩ませてきました. 多次元配列を 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
            )
      )
)   

[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の値がインデックスに依存する場合ループ、要素に直接アクセスすることと、その配列(配列のレイヤーの奥深く)を独自の配列として保存することと、その値にそのようにアクセスすることに違いはありますか?

4

2 に答える 2

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 は参照モデルを使用し、レイジー コピー オン ライトを実行するため、そうではなく、コストは配列のサイズに関係なくほぼ同じです。

(もちろん、代入後に要素を変更する場合を除いて、そのため $tempArray は元のスライスと同じではなくなり、その時点で、参照を分割する必要があるため、代入がスライスのクローンをトリガーするため、メモリ使用量が急増します。 )

OK、このアプローチは、繰り返しFETCH_DIM_Rルックアップを節約するためにスライスへのローカライズされた読み取り専用アクセスを多数実行している場合に価値があるかもしれません(PHP コンパイルは、インデックスの繰り返し使用のローカル最適化をまったく行いません)。 ただし、更新時に足を踏み入れる機会は重要です。

microtime()ループ and andを使用して、これを自分でベンチマークしてみませんmemory_get_usage()か?

于 2012-07-11T08:49:04.167 に答える
1

for ループを使用して巨大な多次元配列を作成することで、これを自分で簡単にテストできますが、大きな配列にインデックスを付ける場合は、通常、直接アクセスする方が高速です。

より小さな配列 (〜 500 項目以下) では、顕著な違いはありません。

于 2012-07-11T00:53:13.567 に答える