6

これがコードであるかどうかを言います:

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

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

「値渡し」なので、そのような大きな配列を返すのは効率的ではありませんか?(1000ではなく1000000の場合)。改善するには、最初の行を次のように変更します。

function &bar() {

つまり&、関数名の前に を追加するだけです。大きな配列が返された場合、これは正しい方法であり、推奨される方法ですか?

4

5 に答える 5

8

PHP が変数ストレージを処理する方法について、多くの誤解があります。PHP は「コピー オン ライト」であるため、スペースや時間を節約するために「参照」(実際にはシンボル テーブルのエイリアス) を作成する必要はありません。実際、そうすることはあなたを傷つける可能性があります。何かのエイリアスとして使用する場合にのみ、PHP で参照を作成する必要があります。両方のスニペットを実行しましたが、実際には 2 番目のスニペットがより多くのメモリを使用しているように見えます (それほどではありませんが)。

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

于 2012-05-02T00:15:58.187 に答える
5

COWのため、まったく同じ量のメモリを消費します

  1. http://ideone.com/bZgm7
  2. http://ideone.com/e3Jfr

PS:参照渡しで「真」を取得するには、割り当てに追加する必要もあります。

$ha =& bar();
于 2012-05-02T00:15:40.930 に答える
3

関数内および外部で a をスローするmemory_get_peak_usage()と、配列を返してもメモリが増加しないことがわかります。

PHP は書き込み時にコピーします。この場合、元の変数はスコープ外なので、書き込んでもコピーするものはありません。いいえ、これを行う理由はありません。

実際、PHP では、参照が提供する機能(元の変数を変更する) が必要でない限り、通常、参照を使用する理由はありません。

于 2012-05-02T00:16:07.513 に答える
1

公式のマニュアルページには次のように書かれています: 関数を使用して、参照をバインドする必要のある変数を見つけたい場合は、参照による戻りが役立ちます。パフォーマンスを向上させるために参照渡しを使用しないでください。エンジンはこれを自動的に最適化します。正当な技術的理由がある場合にのみ参照を返す

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

したがって、あなたの場合は使用しないでください。

于 2012-05-02T00:20:03.097 に答える
0

これはどうですか?

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

bar(&$ha);
print_r($ha);
于 2012-05-02T00:16:06.280 に答える