スレッド表示 | フラット表示〕 全トピック 920 件中 702 番目 次≫ ≪前

値渡しと参照渡しの差について

created: 2004-01-05 17:55 | modified: 2004-01-07 00:15 | reply: 3

[1208] 値渡しと参照渡しの差について

user: PaKa | created: 2004-01-05 17:55
初めまして。PHPの勉強をしているPaKaと申します。
PHP Tipsなどを興味深く読ませていただいていますが、「関数の値渡しと参照渡し、どちらが速い?」の項目について少し気になりました。

僕も見るだけでは納得できないので実際に自分の環境で試してみました。
すると確かに、このままだと参照渡しのほうが高速である結果が出ます。ところが、

// 参照渡しの実行時間測定
$time1 = getmicrotime();
for($n = 0; $n < $coumt; $n++){
str2($str);
}
$time2 = getmicrotime();
$timeS = $time2 - $time1;

// 値渡しの実行時間測定
$time1 = getmicrotime();
for($n = 0; $n < $coumt; $n++){
str1($str);
}
$time2 = getmicrotime();
$timeA = $time2 - $time1;

こんな感じで呼び出す順番を逆にすると今度は値渡しの方が速い結果が出たのです。
その下にもう1回参照渡しの測定を加えるとほぼ同じ割合になりました。
つまり最初に書いた場合だけ何らかの余計なオーバーヘッドが加わっているのではないでしょうか?

実際にどうなのかはよくわかりませんが、このような結果になったので報告しておきます。
(過去ログ全部読んだわけではないので既出でしたらすみません。。)
reply: 1209 返信 編集 削除

[1209] Re.値渡しと参照渡しの差について

user: ゆうじ | created: 2004-01-06 01:03
ご意見ありがとうございます。
私のほうでも自宅PCにて、
値渡しと参照渡しの順番を入れ替えて確かめたところ、
PaKaさんのおっしゃる通り、
値渡しの方が速いという結果になりました。

また、
1.値渡し
2.参照渡し
3.値渡し
4.参照渡し
とやって、3と4の実行速度を比べたところ、
値渡しのほうが若干高速なほどでした。

はじめに実行したスクリプトに、
何らかのオーバーヘッドがかかっているか、
Zendエンジンやキャッシュなどにより、
後から実行したコードが最適化されたのだろうと思われます。


原因究明は私には荷が重い(というか無理)ですが、
参照渡しと値渡しの速度比較実験は、
テストスクリプトが適切ではなかったようです。
長らく間違った情報をお伝えして申し訳ありませんでした。

掲載中のページについては
テストスクリプトを再検討し修正させていただきます。
ご意見お寄せ頂き誠にありがとうございました。
また気づいたことがありましたら、
ご意見お寄せいただければ幸いです。
Parent: 1208  reply: 1210 返信 編集 削除

[1210] 原因?

user: PaKa | created: 2004-01-06 12:19
自分なりに理由を考えたり探したりしてみたところ
http://www.php.net/manual/ja/features.php
ここの下にあるUser Contributed Notesの所に次のような記述がありました。
『PHP4 also have reference count feature. For example, memory for variables is shared when it assigned to other variable. If contents has been changed, PHP4 allocate new memory for it.
For example, programmer does not have to use pass by reference for large parameters for better performance with PHP4.』

つまり値渡しにしても、最初は実際には共有されていて、値を変えようとしたときに初めてコピーされるって事・・・かなぁ?

MLにも似たような投稿がありました。
http://ns1.php.gr.jp/pipermail/php-users/2002-September/010350.html

あまり詳しくないので厳密にどのような処理をしているのかはわかりませんが、パフォーマンス向上のためだけに使用する必要はないのかも知れません。
Parent: 1209  reply: 1215 返信 編集 削除

[1215] 納得:値渡しと参照渡しとの違い

user: ゆうじ | created: 2004-01-07 00:15
そういうことでしたか♪
変数を関数に渡した時点では、
参照渡しも値渡しも変わりなく、
値に変更が加えられる時になって初めて
違いがあるわけですね。

C言語でいうところの、
値渡しと参照渡しとはまったく異なる性質ものだったのですね。
納得♪


こうしたPHPの特徴(性格)も、
大変興味深いところですのでもう少し検証を重ね、
その方向でテストスクリプトを考えてみたいと思います。

情報提供いただきありがとうございます。
大変勉強になりました。
Parent: 1210  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 702 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑