PHP风格的问题:;高速缓存”;变量中的对象/数组值


PHP style question: "caching" object/array values in a variable?

请把我从自己身边救出来(或者让我放心,我没有完全被误导)

我已经养成了编写代码的习惯,比如:

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 

这对我来说似乎很好。但这只是第二点。

我建议:

  1. 请确保您的代码可读且可理解(文档、正确的变量命名、代码样式指南等)
  2. 在语言中搜索现代标准或未来的新标准(这里是php)并坚持下去
  3. 可重复使用:这是第1点和第2点的好处
  4. 性能问题应该在算法/设计模式层上讨论,而不是在深层代码的基础上讨论。在最后的实现中,只需确保您正确地实现了它
  5. 优化:只有当出现一些性能问题时,才考虑深度代码优化。但要确保它是不可理解和可读的。否则,代码将来会变得毫无用处