PHP函数的参数按值传递和引用传递哪个效率更高?
按值传递
function abc($t){<br /> $c=$t;<br />}
Salin selepas log masuk
引用传递
function abc(&$t){<br /> $c=$t;<br />}
Salin selepas log masuk
我把很长的一篇文章赋给变量$t,然后循环10万次 abc($t), 发现按值传递的速度要比引用传递快不少
我无法理解的是,为什么PHP中按值传递反而快呢?理论上讲按值传递有个复制的过程,而引用是直接指向内存地址,应该引用传递更快才对,希望各位能解答我的问题。
另外有什么讲PHP执行效率的书籍,推荐下,谢谢
------解决思路----------------------在PHP中,对于&引用操作符采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。
当你在使用&符号把$a数组传入函数时,PHP引擎会认为这个函数可能会导致对$a的改变,此时就会自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储。这就是前面提到的“写时拷贝”概念。
你可以测试对比一下用值传递与引用传递执行效率,比如外面加入一个循环1000次,看看运行的耗时,结果会让你知道不正确使用PHP引用&符号会导致性能下降30%以上。
因为多了一项拷贝的操作,所以会导致系统资源的耗费(尤其是大数组的情况),因此,在PHP中,要尽量使用值传递,而少用引用传递。
------解决思路----------------------所以说是要不断地学习
由#4
125544 一开始的内存占用量
126640 定义了 $a 之后,增加了 1096
f1:126656 传值调用 f1,增加了 16(应该是一个指向$a的指针之类的东西)
f1:126688
126656 从 f1 返回后,尚有 16 未释放
f2:126672 传引用调用 f2,增加了 16
f2:125656
125656 从 f2 返回后,内存占有还原(126656)
可以看到:以往资料上说的创建副本、写时拷贝等等都已经过时了!