PHP リファレンス効率に関する奇妙な問題の分析_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:19:53
オリジナル
941 人が閲覧しました

関数は次のとおりです:

コードをコピーします コードは次のとおりです:

function update_timelist(&$arr,$timestamp,$threshold){
$timequeue = &$arr['timequeue'];
while(!empty( $timequeue[0])&&($timestamp-$timequeue[0])>$threshold){
array_shift($timequeue)
}
array_push($timequeue, $timestamp); ($arr['count ']$arr['count'] = count($timequeue)
}
}

この関数に問題はありますか?実際、大きな問題があります。それは関数内の行です:

$timequeue = &$arr['timequeue'];

この行により、プログラムは 22M データを読み取り、タイム ノードのリンク リストを生成します。この行を削除して $arr['timequeue'] を直接使用すると、22M の処理にかかる時間は約 10 秒だけ短縮されます。

コードをコピー コードは次のとおりです:
function update_timelist(&$arr,$timestamp,$threshold){
while(!empty($arr['timequeue'][0])&&( $timestamp- $arr['timequeue'][0])>$threshold){
array_shift($arr['timequeue'])
}
array_push($arr['timequeue'],
); if($ arr['count']$arr['count'] = count($arr['timequeue']);
}

誰でもできますそれが何なのかわかりますか? 問題がありますか?問題は count 関数にありますが、私は思いつきませんでした。 PHP は、次のコードのように、変数が指す実際のコンテンツ空間を参照型および非参照型としてマークします。

コードをコピー コードは次のとおりです。 $b = $a;
$c = $b;


PHP の zend エンジンはコピーオン書き込みメカニズムを使用しており、$b と $ がコピーされるときは 1 つのコピーだけが占有されます。 c が「jb51 .net」に変更されている場合、この時点で「jb51.net」のコンテンツ スペース タイプは非参照タイプになり、次のコードに変更されます。


コードをコピーします
コードは次のとおりです。次のように: $a = 'jb51.net' ; $c = &$a; これはどうなるでしょうか? 「jb51.net」を保存するためのメモリ領域はまだ残っていますか?いいえ、$c は $a への参照であり、$a が指す記憶域スペースは参照型としてマークする必要があるため、$b 用に 'jb51.net' の別のコピーを作成する必要があります。非参照型を指します。
$c が $a への参照になっていることがわかります。$b が $a の空間を引き続き実行する場合、$c を変更すると $b も変更されることになります。したがって、参照が出現したら、それも変更する必要があります。書き込み操作がなくてもコピーされます。また、PHP には変数が指すメモリ空間が非参照と参照の 2 種類しかなく、これら 2 種類を混在させたり転送したりすることはできません。どこかのメモリ空間の状態を変更する必要がある場合は、コピーを作成する必要があります。
$timequeue = &$arr['timequeue'] を追加するとカウントが遅くなる理由を以下に説明します。c 関数の呼び出しプロセスを覚えていますか?実際、渡すパラメータはコピーして渡す必要があります。これは PHP にも当てはまります。ただし、書き込み時のコピー メカニズムにより、非参照型を渡すときに count は実際にはコピーされませんが、$timequeue がコピーされます。 = &$arr['timequeue '] は $timequeue のメモリ空間を参照型として指定し、count は非参照型を必要とするため、count は $arr['timequeue'] のコピーをコピーする必要があります。 $arr['timequeue'] を直接渡しても問題がないのはなぜですか?もちろん、count は書き込みメカニズムのコピーを使用します。array_shift と array_push はどうですか?これらは参照で渡されます。心配しないでください。これは $arr['timequeue'] の型を変更するのではなく、実際には $arr['timequeue'] のエイリアスを渡します。

私は PHP の学習を始めたばかりです。上記の分析は正しくない、または包括的ではない可能性があります。電子メールを送信したり、私のホームページにメッセージを残して、私とコミュニケーションをとることができます。


http://www.bkjia.com/PHPjc/325220.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/325220.html

関数は次のとおりです: コードをコピーします コードは次のとおりです: function update_timelist($arr['timequeue']; while(!empty($timequeue[0])($timestamp-$timequeue[0])$threshold) { array_shift($timequeue) } a...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!