请把我从自己身边救出来(或者让我放心,我没有完全被误导)
我已经养成了编写代码的习惯,比如:
function foo($aUserObject) {
$theUserUID = $aUserObject->uid;
$aDeepValue = $aUserObject->property[123][456];
[more code, in which much use is made of $theUserUID and $aDeepValue]
}
我的策略可能是显而易见的:我的态度是,PHP解释器处理变量引用比不断深入对象以找到我感兴趣的东西更容易,所以我应该会获得一些性能优势。此外,我的代码可能更容易理解(只要我记得变量名的含义),因为我主要写简单的变量名,而不是更长、更复杂的对象/数组引用,因为我的手指更容易滑动。我知道这样做是有代价的——现在有两个$aUserObject->uid
和$aUserObject->property[123][456]
的副本在四处浮动,如果这些值很大,那么额外的内存成本可能会增加。但我目前愿意付出这个代价来换取(所谓的)好处。
或者,这就是我告诉自己的,基于我对PHP基础如何工作的天真理论。但现实情况,尤其是当引入像APC这样的操作码缓存工具时,可能会完全不同。有什么更明智的意见,可能会以某种方式推动我?
谢谢!
我可以向你保证,当你说:时,你错了
我知道这样做是有代价的——现在有两个$aUserObject->uid和$aUserObject->property[123][456]的副本在四处浮动,如果这些值很大,那么额外的内存成本可能会增加。
除非$theUserUID
被修改或引用,否则它指向与您获取它的属性完全相同的内存位置。
你甚至可以做:
$a = $b = $c = $d = $e = 'hello world!';
它不会占用比更多的内存
$a = 'hello world!';
将在以下情况下创建副本:
$a = 1;
$b = $a; // $b references $a
$b = 2; // $b is now a copy (no longer references $a)
$a = 1;
$b = $a; // $b references $a
$c = &$b; // $b is now a copy (no longer references $a)
它被称为写时复制。
提示:尝试debug_zval_dump和memory_get_usage,注意到refcount
在增加,而内存使用率保持不变。
如果我错了,请纠正我,但我相信你在某些方面错了。
there are now two copies of $aUserObject->uid and $aUserObject->property[123][456] floating around, and if those values are large, the additional memory costs could add up.
会有另一个对该值的引用,但这并不意味着它将占用两倍的内存。这就像一个关系数据库,你可以向同一个元素添加很多引用,但只有引用本身会被多次存储。
如果您计划维护代码,那么更易于理解的代码是一个大优势。
当然,有些例程可能比其他例程更需要关注内存/性能问题,但除非您要处理大量数据,否则其好处是物有所值的。
顺便说一下,你也可以使用参考:
$theUserUID = &$aUserObject->property[123][456];
$theUserUID = 'someValue'; // updates $aUserObject
这对我来说似乎很好。但这只是第二点。
我建议:
- 请确保您的代码可读且可理解(文档、正确的变量命名、代码样式指南等)
- 在语言中搜索现代标准或未来的新标准(这里是php)并坚持下去
- 可重复使用:这是第1点和第2点的好处
- 性能问题应该在算法/设计模式层上讨论,而不是在深层代码的基础上讨论。在最后的实现中,只需确保您正确地实现了它
- 优化:只有当出现一些性能问题时,才考虑深度代码优化。但要确保它是不可理解和可读的。否则,代码将来会变得毫无用处