ホームページ  >  記事  >  バックエンド開発  >  PHP 関数のパラメータを値で渡すのと参照で渡すのはどちらが効率的ですか?

PHP 関数のパラメータを値で渡すのと参照で渡すのはどちらが効率的ですか?

WBOY
WBOYオリジナル
2016-06-23 13:33:161516ブラウズ

値渡し

function abc($t){	$c=$t;}

参照渡し
function abc(&$t){	$c=$t;}

長い記事を変数 $t に代入し、abc($t) を 100,000 回ループしたところ、値渡しの方が参照渡しよりはるかに高速であることがわかりました

とはなぜ PHP では値渡しが速いのか理解できません。理論的には、値渡しの場合はコピー処理があり、参照はメモリアドレスを直接指しているため、参照の受け渡しは高速になるはずです。

他にお勧めの PHP 実行効率に関する本はありますか? ありがとうございます

ディスカッション (解決策) への返信

テスト方法に何か問題があるはずなので、テスト結果は役に立ちません

値の受け渡し 参照渡しと参照渡しの違いは、前者は関数本体に変更を反映できないのに対し、後者は反映できることです
値渡しと参照渡しの総メモリ消費量は同じです
渡す場合値渡しでは、最初にコピーが作成されてから関数が呼び出されます
参照渡しの場合は、まず参照フラグを持つ空の変数本体を関数に渡し、次に関数本体で変数を使用するときにコピーを作成します

phpの変数本体は64バイトの構造体なので、参照を渡しても渡さなくても構造体のサイズは
にはなりません
値渡しか参照渡しかの選択は制御ロジックに依存します個人的な好みです
ただし、複数の変数が同時に返される場合は、参照渡しの方が便利です

参照渡しの場合、渡される変数は組立ライン上の半完成品のようなもので、各関数は一部のみを処理します
形式的にはよりスムーズに見えますし、操作の成功は関数の戻り値によって判断できます (これはどのような設計パターンですか?覚えていません)

実際には同じです、
ただし、渡した値が変更され、外部がそれを知りたい場合は、参照を使用し、それ以外の場合は値を使用します。


テスト方法に何か問題があるはずなので、テスト結果は無価値です

値渡しと参照渡しの違いは、前者は変更を関数本体に反映できないのに対し、後者は変更を反映できることです


値渡しと参照渡し 参照ペアの総メモリ消費量は同じです
値渡しの場合、最初にコピーが作成されてから関数が呼び出されます
参照渡しの場合、参照フラグを持つ空の変数本体は最初に関数に渡され、関数本体で変数が使用されるときにコピーが作成されます

php の変数本体は 64 バイトの構造体なので、参照が渡されるかどうかに関係なく、構造体のサイズは変更しません

値を渡すか参照を渡すかは制御ロジックと個人の好みによって異なります
複数ある場合のみです 変数を同時に返す場合は参照渡しの方が便利です

参照渡しの場合渡される変数は、組立ライン上の半完成品のようなものです。これは、形式的にはよりスムーズであり、操作が成功したかどうかを判断することができます。パターンはこれ? on-write」は、書き込み操作が発生しない限り、同じアドレスを指す変数またはオブジェクトはコピーされないことを意味します。

& 記号を使用して $a 配列を関数に渡すと、PHP エンジンはこの関数によって $a が変更される可能性があると判断し、この時点で $a のデータ コピーを $b に自動的に生成します。メモリのブロックを再度適用します。これが、前述した「コピーオンライト」の概念です。

値渡しと参照渡しの実行効率をテストして比較することができます。たとえば、ループを 1000 回外に追加して、実行にかかる時間を確認します。その結果から、PHP 参照の誤った使用がわかります。 & 記号を使用すると、パフォーマンスが 30% 以上低下します。

追加のコピー操作があるため、システム リソースが消費されます (特に大きな配列の場合)。そのため、PHP では値の転送を使用し、参照転送の使用量を減らすようにしてください。

したがって、学習を続ける必要があります

#4 から
125544 初期メモリ使用量
126640 $a を定義した後、1096 増加しました
f1:126656 f1 を値で呼び出すと、16 増加しました (これは、へのポインタである必要があります) a)の$ポインタ
f1:126688
126656 f1から戻ってきたら未解放が16個ある
f2:126672 f2を参照呼び出しすると16増えた

f2:125656

125656 f2から戻ったらメモリ占有が元に戻る(126656)

ご覧のとおり、以前の情報で説明したコピーの作成、コピーオンライトなどはすべて時代遅れです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。