问一个函数大数量返回的问题

liujan611
anti-creditcard 2012-09-20 字数 852

通过soap服务,返回的数据量很大,这部分操作通过OO封装。

$data = $service->get_data();   // get_data()返回的数据可能有上万条。

由于php的值拷贝机制,这样是否效率比较低。

使用引用:

$data = & $service->get_data();

// 看了php作者不是太赞同这样用(from programming php, Rasmus Lerdorf),

// 谁能帮我解释下。 谢谢。

This technique is sometimes used to return large string or array values efficiently from a function. However, PHP’s copy-on-write/shallow-copy mechanism usually means that returning a reference from a function is not necessary. There is no point in returning a reference to some large piece of data unless you know you are likely to change that data. The drawback of returning the reference is that it is slower than returning the value and relying on the shallow-copy mechanism to ensure that a copy of that data is not made unless it is changed.

PHP PHP程序设计语言
8 个回复
KimsHell
-,-·· 2012-09-20

php是引用计数模式

&用于修改一个的同时也想修改其他值的情况

其他场合直接返回更合适

【 在 liujan611 (anti-creditcard) 的大作中提到: 】

: 通过soap服务,返回的数据量很大,这部分操作通过OO封装。

: $data = $service->get_data();   // get_data()返回的数据可能有上万条。

: 由于php的值拷贝机制,这样是否效率比较低。

: ...................

liujan611
anti-creditcard 2012-09-20

如果返回的是一个array,这个array比较复杂,数据量有几万条。

我觉得这样做,是否效率比较低。 从c/c++转换到php,这点特别不能理解。

【 在 KimsHell (-,-··) 的大作中提到: 】

: php是引用计数模式

: &用于修改一个的同时也想修改其他值的情况

: 其他场合直接返回更合适

KimsHell
-,-·· 2012-09-20

那段英文说 php是写时拷贝

也就是说 $a=$b, 在对变量内容进行修改前

并不在内存中进行内容复制操作

不追究细节的描述下, 可以认为php维护了一个变量名到实际值的对应关系表

过程$a=$b只是增加了一条映射记录

【 在 liujan611 (anti-creditcard) 的大作中提到: 】

: 如果返回的是一个array,这个array比较复杂,数据量有几万条。

: 我觉得这样做,是否效率比较低。 从c/c++转换到php,这点特别不能理解。

Orpherus
奥路菲 2012-09-20

cpp码农也有不了解copy-on-write的?

【 在 liujan611 的大作中提到: 】

: 如果返回的是一个array,这个array比较复杂,数据量有几万条。

: 我觉得这样做,是否效率比较低。 从c/c++转换到php,这点特别不能理解。

Merlini
AAA 2012-09-20

debug_zval_dump下,没改变时只是加refcount

改变了才重新分配内存

【 在 liujan611 (anti-creditcard) 的大作中提到: 】

: 通过soap服务,返回的数据量很大,这部分操作通过OO封装。

: $data = $service->get_data();   // get_data()返回的数据可能有上万条。

: 由于php的值拷贝机制,这样是否效率比较低。

: ...................

liujan611
anti-creditcard 2012-09-20

不了解。

【 在 Orpherus 的大作中提到: 】

: cpp码农也有不了解copy-on-write的?

liujan611
anti-creditcard 2012-09-24

谢谢。继续追问:

所谓的写时copy,也就是在$a=$b, $a对该变量(可能是对象,也可能是数组,也可能是复杂的结构体)进行写操作时,才将$b的内存拷贝到$a?

那么浅拷贝机制呢?

如果$a = $b(比如,$b is an array of array type,二维数组类型,其元素类型是对象),这个时候$a要对$b所声明的变量进行拷贝,浅拷贝机制是否存在问题?

【 在 KimsHell (-,-··) 的大作中提到: 】

: 那段英文说 php是写时拷贝

: 也就是说 $a=$b, 在对变量内容进行修改前

: 并不在内存中进行内容复制操作

: ...................

Merlini
AAA 2012-09-24

对象赋值是浅拷贝

【 在 liujan611 (anti-creditcard) 的大作中提到: 】

: 谢谢。继续追问:

: 所谓的写时copy,也就是在$a=$b, $a对该变量(可能是对象,也可能是数组,也可能是复杂的结构体)进行写操作时,才将$b的内存拷贝到$a?

: 那么浅拷贝机制呢?

: ...................