天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP 引用是個壞習慣

復制代碼 代碼如下:
function binsearch(&$arr, $key, $value)
{
$low = 0;
$high = count($arr);
while ($low <= $high) {
$mid = floor($low + ($high - $low) / 2);
$item = $arr[$mid][$key];
if ($item == $value) {
return $mid;
} else if ($value > $item) {
$low = $mid + 1;
} else {
$high = $mid - 1;
}
}
return false;
}

在這里,$mid 采用了先減后加的方法計算,目的是為了防止整數的溢出。不是故意寫復雜了。
我用下面的代碼進行測試:
復制代碼 代碼如下:
$data = array();
for ($i = 0; $i < 1000000; $i++)
{
$data[] = array("sq" => $i * 2);
}
var_dump(binsearch($data, "sq", 10000));

發現,binsearch 的時候,總是要花個 0.2s左右。理論上來說,100萬的數據,最多也就是循環20次。怎么會這樣慢呢。
后來監控了一下內存,data 數組 占用了 230M 的內存。而 binsearch 的時候,占用了60K 的內存。但是,理論上來說,binsearch
不應該占用如此多的內存。因為,我覺得,我已經用引用了,根本就沒有對data 的結構進行修改。
我也是百思不得其解,后來,我把引用參數去掉,居然 binsearch 只要 0.0002s ,看來是引用耗費了大量的cpu 資源。
php 內部遵循一個copy on write 的原則。實際上這個引用是多余的。
但是為什么,加了引用速度會變慢呢?今天重點就談談這個問題。明白道理后,大家一定知道怎么用引用了。
如果在binsearch 調用前,直接 $a = &$data,這個引用的速度會非常的快。看來肯定不是引用本身產生的問題。
這個問題,實際上涉及了zend 引擎如何管理php變量。
先看下面的問題:
復制代碼 代碼如下:
<?php
function demo(&$a, &$b) { $a =& $b; }
$a = 1;
$b = 2;
demo($a, $b);
$b = 3;
print $a;
?>

$a 輸出是多少呢?不錯,是2. 不過,我一開始覺得是3。
那么怎么解釋上面這個問題呢?
實際上,函數的參數引用是這樣進行的。
復制代碼 代碼如下:
$tmp = $a;
$a1 = &$tmp;
$a = $tmp;
unset($a1, $tmp);

這里,引用的實際上是一個臨時變量。這個時候,$tmp 是帶引用屬性的,而$a 變量不是帶引用屬性的。
根據zend引擎管理內存的方法,在內部,不能用一個zval 來表示,必須強制分離這個zval。
用這樣的理解方法,上面的問題就解決了。函數內部,不會改變函數外部的引用特性。這也是php
不贊成用 calltime_by_ref 的原因,而選擇上面如此低效的拷貝方法。
下面的分析,也能證明,在傳遞參數時,的確發生了拷貝。
在 binsearch 函數里面。
$data[0] = 1;
這樣,就會發生一次$data 所在zval 的拷貝。內存使用量 就是 60K。和函數調用加引用一模一樣。
可能很多人會疑問,為什么不是多了230M呢,這其實就是php的高明之處,數組Key 對應的是一個zval的指針。(內部是一個哈希表)
所以,只要把這些指針復制一遍就就好了,數據不用復制。但是,100萬的php 哈希表實際上要占用 50M 內存。為什么只有60K呢。
在 binsearch 函數的外面,運行
復制代碼 代碼如下:
$t = $data;
$t[0] = 1;
unset($t);

果然,多了60K 的內存。估計和php的內存管理機制有關系。
現在一切都明白了吧!今天,想了好幾個小時,才把這個問題想通,不敢獨享。
函數中的引用不是給你傳參數方便的,而是讓你實現,一個函數,可以有多個返回值的,所以,最好不要畫蛇添足。
實際上,用引用它會降低性能。

php技術PHP 引用是個壞習慣,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 为什么丈夫插我我却喜欢被打着插 | 亚洲 欧美 国产 综合久久 | 国产97视频在线观看 | 果冻传媒APP免费网站在线观看 | 2021全国精品卡一卡二 | 忘忧草日本在线社区WWW电影 | 日本高清天码一区在线播放 | 一个人免费观看HD完整版 | 色综合欧美色综合七久久 | 黄小说免费看 | 99精品99| 亚洲AV无码影院在线播放 | 国内精品伊人久久久久 | 伊人久久99热这里只有精品 | 国产中文字幕乱码免费 | 国产国拍亚洲精品av麻豆 | 国产三级在线免费 | 夜夜国产亚洲视频香蕉 | 最近中文字幕高清中文 | 国产成人精品123区免费视频 | 性xxx欧美 | 男人被绑着强行摸j | 97在线超碰免费视频 | 久久精品中文闷骚内射 | 抽插内射高潮呻吟爆乳 | 久久99r66热这里只有精品 | 动漫H片在线播放免费高清 动漫AV纯肉无码AV电影网 | 夜夜躁日日躁狠狠 | 天天爽夜夜爽 | 黑人娇小BBW | 国产在线精品一区二区在线看 | 挺进绝色老师的紧窄小肉六 | 厕所RXXX | 果冻传媒独家原创在线观看 | 少妇两个奶头喷出奶水了怎么办 | 花季v3.0.2黄在线观看 | 日本高清不卡码无码v亚洲 日本福利片午夜免费观着 日本粉嫩学生毛绒绒 | 国语对白嫖老妇胖老太 | 伊人影院综合网 | 蜜臀AV99无码精品国产专区 | 免费国产综合视频在线看 |