PHP确实修改了更新它的字符串副本

时间:2014-06-09 09:57:38

标签: php string performance pointers

我正在编写一个脚本,尽可能多地进行优化,甚至进行微优化,但幸运的是,这个问题并不是围绕这些方法的必要性,而是更多地了解PHP正在做什么。

$sql = rtrim($sql, ',');

运行此行时,我想知道的是内部返回的值是新字符串(即修改后的副本)还是内存中的相同值,但是已更新。

如果这条线看起来像这样:

$sql2 = rtrim($sql1, ',');

然后我不会问,但是因为它是对同一个变量的修改,我想知道PHP是否用修改过的副本覆盖它,或者在内存中更新相同的值。

出于性能原因,我需要在尽可能短的时间内运行相同的操作数百万次,这就是我真正迷恋每一个细节的原因。

这个问题不只是针对上面的例子,而是针对字符串操作。

1 个答案:

答案 0 :(得分:1)

回答你的特定问题:字符串存储在名为ZVAL的内部结构中,ZVAL执行一个惰性副本,即复制引用相同的ZVAL并使其引用计数增加。更新字符串会减少ZVAL上的引用计数(当计数为零时,垃圾会收集引号)。在更新时,会创建一个指向新值的新ZVAL。

现在对支持这个问题的一般误解:

  

出于性能原因,我需要在尽可能短的时间内运行相同的操作数百万次,这就是我真正迷恋每一个细节的原因。

A bubble sort是O(N²)。一个聪明的冒泡排序仍然是O(N²)。对算法的简单更改可以降低到O(N logN)。道德:算法优化带来了巨大的收益;微优化很少这样做,并且通常会产生反效果,因为它们可以创建不可维护的代码。

在SQL优化的情况下,用正确索引(join和)单个语句替换语句循环可以在运行时节省一个数量级。

使用Array函数调用替换PHP for循环也可以这样做。

相关问题