PHP参考是一个坏习惯。
功能折半查找($ ARR,美元价值的关键,)
{
低= 0;
$高=计数($ ARR);
虽然(低$高){
美元=地板(低美元+($高-低) 2);
项目=美元美元美元美元中期} { ARR {重点};
如果($ = $ value){
返回$中;
否则}如果($ > $项目){
$ = $中+ 1;
{人}
高= 1美元;
}
}
返回false;
}
在这种情况下,为了减少整数的溢出,采用先减后加的方法计算中间值,这不是有意写的。
我使用以下代码进行测试:
复制代码代码如下所示:
$ =数组();
($ i = 0;$ i < 1000000;$ + +)
{
$数据=数组(SQ = $ i * 2);
}
var_dump(折半查找(美元的数据,平方
当谈到折半查找,它总是需要0.2s.in理论,在大多数的数据,100万,是20个周期。怎么这么慢。
后来,记忆监控和数据数组占用的内存230m,折半查找,它占用60K的记忆。但是,在理论上,Binsearch
这么多内存不应该占用,因为我认为我使用了引用,而且数据的结构根本没有改变。
我也一百想去解决它,后来,我删除了参考参数,其实只要0.0002s折半查找,它似乎是一个参考的成本大量的CPU资源。
PHP遵循写复制的原则,事实上,这个引用是多余的。
但是,为什么以参考的速度,会比较慢呢今天的重点是这个问题。当你了解真相时,你必须知道如何使用它。
如果美元=美元之前数据直接折半查找电话本参考速度会很快。当然,似乎没有一个自己的问题。
其实这个问题,,涉及到Zend引擎管理PHP变量。
首先看下面的问题:
复制代码代码如下所示:
< PHP
函数演示($ A,b){ $ A = $;}
$ = 1;
$ = 2;
演示(A,B);
$ = 3;
打印$;
>
A的输出是多少是的,是2点,但我开始认为是3点。
那么你如何解释上面的问题呢
事实上,函数的参数引用就是这样完成的。
复制代码代码如下所示:
$ $ = $;
$ A1 = $ TMP;
美元= TMP;
unset($ A1,$ TMP);
这里,引用实际上是一个临时变量。此时,TMP是一个引用属性,而$变量不是引用属性。
根据管理内存的方法由Zend引擎,在室内,这是不可能使用一个变量来表示,它必须被迫分离变量。
有了这样的理解方法,上述问题就解决了,在函数内部,函数的引用特性没有改变,这也是PHP。
不赞成使用calltime_by_ref原因,选择这样一个低效的复制方法。
下面的分析还表明,当参数传递时,复制确实发生。
在折半查找功能。
$ { 0 } = 1;
这样,会有一个复制的机制,数据位于美元。内存使用量是60K。函数调用是完全一样的参考。
也许很多人会疑问,为什么没有更多的2.3亿,这实际上是PHP的明亮的地方,数组的键对应一个变量的指针。(内部哈希表)
所以,只要复制这些指针只是一次,而数据没有被复制。然而,PHP的哈希表100万实际占用50m记忆。为什么只有60k
在折半查找功能,运行
复制代码代码如下所示:
$ $ = $数据;
$ { 0 } = 1;
设置(T);
果然,60K内存更多。估计是PHP的内存管理机制。
现在一切都清楚了,今天,我想几个小时来思考这个问题,不敢独自享受它。
引用函数不是为您方便地传递参数,而是让您认识到,一个函数可以有多个返回值,所以最好不要多余。
事实上,引用它可以降低性能。