ホームページ  >  記事  >  バックエンド開発  >  作業効率を改善する方法 PHP リファレンス効率に関する奇妙な問題の分析

作業効率を改善する方法 PHP リファレンス効率に関する奇妙な問題の分析

WBOY
WBOYオリジナル
2016-07-29 08:48:191120ブラウズ

関数は次のとおりです:

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


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'] を直接使用するようにこの行を変更すると、時間が 30 秒短縮され、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 は、次のコードのように、変数が指す実コンテンツ空間を参照型および非参照型としてマークします。

コードをコピーします コードは次のとおりです。 net'; $b = $a;

$c = $b;



は、PHP の zend エンジンが書き込み時にコピーを使用するため、$ の場合にのみコピーを作成します。 b と $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 の学習を始めたばかりです。上記の分析は正しくない、または包括的ではない可能性があります。電子メールを送信したり、私のホームページにメッセージを残して、私とコミュニケーションをとることができます。
以上、作業効率を向上させる方法と、PHP 参照効率の奇妙な問題の分析を紹介しました。作業効率を向上させる方法を含め、PHP チュートリアルに興味のある友人の参考になれば幸いです。



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