PHP 関数のパラメータを値で渡すのと参照で渡すのはどちらが効率的ですか?
値渡し
function abc($t){<br /> $c=$t;<br />}
ログイン後にコピー
参照渡し
function abc(&$t){<br /> $c=$t;<br />}
ログイン後にコピー
長い記事を変数 $t に代入し、abc($t) を 100,000 回ループしたところ、次のことがわかりました。値による受け渡しは、参照による受け渡しよりもはるかに高速です
私が理解できないのは、なぜ PHP では値による受け渡しのほうが速いのかということです。理論的には、値渡しの場合はコピー処理があり、参照はメモリアドレスを直接指しているため、参照の受け渡しは高速になるはずです。
PHP の実行効率に関する他にお勧めの書籍はありますか。ありがとうございます。
-----ソリューションのアイデア-------------- -- ------PHP では、& 参照演算子は「コピーオンライト」の原則を採用しています。つまり、書き込み操作が発生しない限り、変数またはオブジェクトは同じアドレスを指します。コピーされません。
& 記号を使用して $a 配列を関数に渡すと、PHP エンジンはこの関数によって $a が変更される可能性があると判断し、$b の $a データを自動的に生成します。そして、ストレージ用にメモリを再適用します。これが、前述した「コピーオンライト」の概念です。
値による受け渡しと参照による受け渡しの実行効率をテストして比較することができます。たとえば、ループを 1000 回外に追加して、実行にかかる時間を確認します。その結果により、使用法が間違っていることがわかります。 PHP リファレンスとシンボルを使用すると、パフォーマンスが 30% 以上低下します。
追加のコピー操作があるため、システム リソースが消費されます (特に大きな配列の場合)。そのため、PHP では値の転送を使用し、参照転送の使用量を減らすようにしてください。
------解決策のアイデア----------------------だから、学び続ける必要がある
#4 の先頭からのメモリ使用量
125544
126640 $a を定義した後、f1 を値で呼び出すために 1096
f1:126656 が追加され、16 が追加されました ($a ポインタとlike)
f1:126688
126656 f1から戻っても解放されていないのが16個あります
f2:126672 f2を参照呼び出しすると、16
f2:125656
125656 後f2 から戻ると、メモリ占有が復元されます (126656)
前の情報で説明したコピーの作成、コピーオンライトなどはすべて古いものであることがわかります。