1. ホーム
  2. php

PHP (>= 5.0) では、参照渡しの方が速いのでしょうか?

2023-12-20 14:02:52

質問

PHPでは、関数のパラメータは、関数宣言でパラメータの前にアンパサンドを付けることで、以下のように参照渡しとすることができます。

function foo(&$bar)
{
    // ...
}

さて、私が認識しているのは、これが ではなく パフォーマンスを向上させるために設計されたものではなく、通常はスコープ外の変数を関数で変更できるようにするためのものであることを理解しています。

代わりに、PHPはCopy On Writeを使用して、変更されるまでオブジェクト(そして多分配列も)をコピーしないようにしているようです。そのため、パラメータを変更しない関数では、参照渡しした場合と同じ効果が得られるはずです。

しかし、私は、Copy On Write ロジックが参照渡しで短絡的に実行され、それがパフォーマンスに影響を与えるかどうか疑問に思っていました。

ETA: 念のため、私はそれが高速化されていないと仮定し、これが参照のためではないことをよく知っています。私は、ボンネットの下で何が確実に起こっているかを本当に知っている人からの答えを探しているのです。5年間のPHP開発において、ソースを読むだけではPHPの内部に関する質の高い情報を得るのは難しいと感じています。

どのように解決するのですか?

Zend Engine は copy-on-write を使用しており、 自分で参照を使用すると、少し余分なオーバーヘッドが発生します。唯一見つけることができるのは この言及 のコメントしか見つかりませんが マニュアル のコメントには他のリンクが含まれています。

(EDIT) マニュアルのページで オブジェクトとリファレンス には、オブジェクト変数とリファレンスがどのように異なるかについて、もう少し情報があります。