26 七月, 2005
PHP4,引用传递还是值传递(Pass-by-reference or Pass-by-value)
因为一直写C/C++程序的缘故,总觉得函数中引用传递要比值传递效率高。然而在PHP4中-使用的是Zend2引擎-事实却并非如此。
Zend引擎引进“引用计数”(Reference Count)概念,在不发生对变量的写操作的前提下,只是简单地修改Reference Count的值,并不做任何实际的Copy动作。也就是说,如果你的函数传入一个数组参数,而函数中对这个数组只有读操作,那么无论这个数组多么庞大,对内存的消耗并不因此增加,执行性能也不会因此降低。因为PHP解释器并不会生成(Copy)这个大数组的副本。
“引用计数”机制是Zend内部在处理变量和参数传递时的隐含(implicit)机制。如果你显式(explicit)地使用“别名”(Alias)或者显式地以Reference方式传递参数,也就是在变量前添加“&”符号,那么,PHP会花费额外的代码来处理,效率反而比值传递低。
今天,我写一个读取utf8字串长度(实际长度,一个中文只算一个)的小程序,一开始使用的是引用传递,结果在处理长达22,000个ASCII字符长度的字串时(需要做超过7000次的显式引用传递),耗时数分钟。当我将传递方式改为值传递后,只需数秒,可见,显式“引用传递”对性能的影响还是很大的。
结论:
PHP4中,如果不需要修改传入参数的值,那么不要使用“引用传递”。
发表评论



