复制代码 代码如下:
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的内存管理机制有关系。
现在一切都明白了吧!今天,想了好几个小时,才把这个问题想通,不敢独享。
函数中的引用不是给你传参数方便的,而是让你实现,一个函数,可以有多个返回值的,所以,最好不要画蛇添足。
实际上,用引用它会降低性能。
相关推荐:
seo网站自学看什么书,seo技术适合自学吗 ,斑马ai阅读
AI人物生成:重新定义虚拟形象创作的未来
SEO架构:提升网站流量的核心策略,东营南江全平台营销推广
ChatGPT诞生背景:人工智能如何突破语言的边界,ai辅助市场调研
SEO优化中怎么找关键词:全面解析与实战技巧,ai2002.4.8
提升写作效率,释放创意潜力文章生成AI软件的未来
《SEO教材:打造网站流量的核心利器,教你轻松SEO优化技巧》,咖啡网站建设总结文案
亚马逊的seo是什么阿,亚马逊seo项目 ,中考用ai写作会判0分吗
ChatGPT付款被拒?如何应对与解决常见支付问题,掉包ai
ChatGPT不能用了?了解这一背后的真相及解决方法,ai恐怖头像
ChatGPT5.0为什么一直没出来?背后的技术与战略,元宵节ai趣赏月
优化提长:让企业效能提升的秘密武器,长沙网站建设创意
seo网站代码是什么,网站专业术语中seo意思是什么 ,拟人ai制作
AI一键生成文章网页版,让内容创作更简单高效
怎样用AI写文章?快速高效创作新技能!
SEO要求:如何优化网站提升搜索引擎排名,助力企业获取更多流量,鹤山区网站运营推广
优化型网站:提升企业竞争力的必备利器,重庆网站推广工作如何
AI写作免费一键生成5000字:高效创作的革命性工具
seo链接有什么用,seo外链是什么意思 ,one ai写作
SEO优化如何进行:提升网站排名,轻松超越竞争对手,ai写作怎么操作手机
摘要AI生成:高效工作的新时代利器
优化,让生活与工作更高效-从个人到企业的全面升级,广州百度seo费用
seo读什么书,seo是哪个专业的 ,亚洲9ai吧
“洗稿技巧如何让你的文章脱颖而出,轻松提升内容创作水平!”,台州椒江seo企业排名
AI人工智能文章生成平台,释放创作无限可能
ChatGPT恢复正常使用时间,提升你的工作与生活效率,联想电脑AI0510
SEO师:如何在数字时代为企业赢得流量与销量,十堰网站关键词优化教程
优化软件:让电脑性能焕然一新,提升效率的秘密武器,大理网站推广招聘信息最新
自动写文章AI:高效创作工具,开启写作新纪元
SEO动态:2025年SEO趋势与优化技巧解析,十堰外贸网站推广费用
ChatGPT页面打不开怎么办?这些解决方法让你轻松访问AI助手!,分散ai
SEO优化公司一般怎么优化?揭秘专业SEO服务的操作流程,人工智能ai写作软件 哪一个好
如何识别文章是否由AI撰写?揭开智能写作的秘密
SEO主要是为网站引流吗?深入解析SEO的核心价值,AI算算
ChatGPT无法访问原因分析及解决方案,斑马ai报道
SEO超级,助力企业站点冲刺搜索引擎排名,白云全网营销推广哪家强
seo要会些什么,seo需要学些什么内容 ,轻盈ai
ChatGPT宕机两小时,OpenAI紧急修复,用户期待AI恢复正常服务,oppo小布ai
SEO工装裤-打造时尚与实用兼备的工作利器,ai画中国爸爸辅导孩子写作业
SEO分类:从基础到进阶,全面解析SEO优化的关键要素,新建设网站排名
2024年AI写文章生成器推荐:让创作轻松高效,提升写作水平
ChatGPT3.5需要登录使用吗?AI使用的真相!,电脑版写作ai推荐怎么关闭
seo网赚什么意思,网站seo赚钱 ,ai打不开ai
ChatGPT怎么打不开了?揭秘背后的原因与解决方法,ai中打开ai文件丢失
seo竞价做的什么工作,seo 竞价 ,office智能ai
SEO才能:提升网站排名,突破网络营销的核心竞争力,南宁本地seo营销公司
GPT在什么时候被人熟知的?从技术突破到广泛应用的背后故事,ai商业新思维ai课程
什么是神马排名?让你的网站脱颖而出,轻松占据搜索引擎的C位!,乳山网站优化关键词排名
SEO站在未来之巅,助力网站在激烈竞争中脱颖而出,推荐网站优化欢迎咨询
SEO优化攻略:如何通过精准策略提升网站排名与流量,aI ow翻译