2012-05-02 6 views
6

セイこれはコードの場合:PHPでは、どのように大きな配列を返すのですか?

function bar() { 
    $result = array(); 
    for ($i = 0; $i < 1000; $i++) { 
     $result[] = $i * 10; 
    } 
    return $result; 
} 

$ha = bar(); 
print_r($ha); 

それは「値で返す」であるので、そのような大規模な配列を返すために効率的ではないですか? (1000でなく1000000である場合)。これは大きな配列が返された場合は、正しいと好ましい方法である -

、ちょうど関数名の前に &を追加することである
function &bar() { 

:だから我々はに最初の行を変更します、それを改善するには?

答えて

7

PHPが可変記憶域をどのように処理するかについて、多くの誤解があります。 PHPは "write on write"なので、スペースや時間を節約するために "リファレンス"(実際にはシンボルテーブルエイリアス)を作成する必要はありません。実際にそうすることで、あなたを傷つけることがあります。 を別名として使用したい場合は、PHPで参照を作成する必要があります。私はあなたのスニペットの両方を走らせました。そして、それは実際にはメモリを使用しているようです。

ちなみに、1000個の整数の配列は、の小さなです。

5

彼らは

  • http://ideone.com/bZgm7
  • http://ideone.com/e3Jfr
  • PSためのCOW

      絶対に同じ量のメモリを消費:あなたも追加する必要が参照渡し "true" を取得します譲渡の中で:

      $ha =& bar(); 
      
    +0

    関数の定義のみが関数の呼び出しではなく、参照符号を持つことができます。 –

    +2

    @Jack:ドキュメント(*注意深く*)を読んで、http://nz.php.net/manual/en/language.references.returnを非表示にしてください。php(特に最初の注記を参照してください: "パラメータの受け渡しとは異なり、ここでは&を両方の場所で使用する必要があります) – zerkms

    +0

    私の謝罪、私は訂正しています..私は言わなければならないかなりわかりにくいもの: –

    0

    これはどうですか?

    function bar($result) { 
        $result = array(); 
        for ($i = 0; $i < 1000; $i++) { 
         $result[] = $i * 10; 
        } 
    } 
    
    bar(&$ha); 
    print_r($ha); 
    
    3

    あなたが機能し、外部にmemory_get_peak_usage()に投げる場合は、配列を返すことは、メモリを増加させないことがわかります。

    書き込み時のPHPコピー。この場合、元の変数が有効範​​囲外であるために書き込みを行ってもコピーするものはありません。そうではありません、これを行う理由はありません。

    実際、PHPでは、の機能が必要な場合を除いて、通常は参照を使用する必要はありません。元の変数を変更する。

    +0

    だから、配列を取り戻した後、ただちに1つの配列要素を変更したり、配列には「書き込み」と見なされますが、「コピーオンライト」はありませんか? –

    +0

    @Jeremy L:関数外で配列を変更すると、参照が1つしかないので、コピーは行われません。それは書き込みとみなされますが、コピーはありません(1つの参照のみが存在するため) – zerkms

    +0

    @Jeremy L:その配列への唯一の参照であるため、書き込み時にコピーはありません。オブジェクトのインスタンス変数を返す場合は、配列を変更した後にコピーが存在します。しかし、その場合は、呼び出し側がオブジェクトのインスタンス配列を変更できるようにしたいのですか?もう一度、私は経験則としてPHPでの参照を使用してパフォーマンスを得ることはしません。 – Matthew

    1

    公式マニュアルページには次のように書かれています。参照を返すことは、参照をバインドする変数を見つける関数を使用する場合に便利です。パフォーマンスを向上させるためにリターン・バイ・リファレンスを使用しないでください。エンジンはそれを自動的に最適化します。あなたがそう

    http://it2.php.net/manual/en/language.references.return.php

    だから、あなたの場合には、それを使用していない行うには、有効な技術的な理由がある場合にのみ参照を返します。

    関連する問題