【发布时间】:2014-06-09 09:57:38
【问题描述】:
我正在研究一个脚本,尽可能多地进行优化,甚至是微优化,但幸运的是这个问题并没有围绕这些方法的必要性,更多的是对 PHP 正在做什么的理解。
$sql = rtrim($sql, ',');
运行此行时,我想知道在内部返回的值是新字符串(即修改后的副本)还是内存中的相同值,但已更新。
如果这条线看起来像这样:
$sql2 = rtrim($sql1, ',');
那我就不会问了,但是因为它是对同一个变量的修改,我想知道 PHP 是用修改后的副本覆盖它,还是更新内存中的相同值。
出于性能原因,我需要在尽可能短的时间内将相同的操作运行数百万次,这就是为什么我非常着迷于每一个微小的细节。
这个问题不只是针对上面的示例,而是针对一般的字符串操作。
【问题讨论】:
-
一个函数有一个不是引用的返回值,所以它几乎肯定是一个新变量。但真正的问题是你为什么要编写 sql 字符串? =)。从上面暗示你的 sql 很可能是不安全/可利用的。或者:为什么重要?无论答案如何,它都不会改变您的代码或性能。如果您真的对代码性能分析感兴趣,不要浪费时间优化需要 0.001% 执行时间的东西。如果代码已经被分析并且你正在寻找最后几个 m% - 表明情况就是这样。
-
正在创建的 sql 稍后会在准备好的语句中使用。它是动态的原因是因为列是动态的。 0.001% 也很重要,因为它和脚本中的所有其他内容都将被循环。另外 1 mill 操作是小规模的,源是一个 200MB 的文件,所以大约 1 mill(行),但文件可以是几个 GB。
-
你意识到帮助你优化你正在做的整个操作会更容易,而不是告诉你如何改进每件事的 0.0001%?根据我所读到的内容,我可以肯定地声称您很可能做错了很多事情,并且在优化您所要求的内容方面所获得的收益与努力是微不足道的。
-
PHP 在内部创建一个包含函数调用结果的新内存位置,然后将其分配给变量 $sql,释放旧值使用的内存;但这不是你应该尝试优化的东西......如果你真的需要知道它在做什么,请使用 VLD
-
为什么很难解释优化内存中的字符串副本并不重要,你的算法才是。您正在努力优化性能,但您忽略了这样一个事实,即您优化的是最便宜的操作之一 - 从一个内存位置复制到另一个内存位置 - 它非常快。即使有数百万次迭代,它也不会累加。这无关紧要,您的时间将被浪费。你应该关注的是优化你的整个算法和文件,而不是字符串复制。
标签: php string performance pointers