3

首先,如果这只是编码风格问题,我深表歉意。我想知道为每个属性或函数分配一个新变量以重新分配现有变量的利弊。这是假设您不需要访问范围之外的变量。

这就是我的意思(注意名称$var0,...只是为了简单起见),选项#1:

$var0= array('hello', 'world');
$var1="hello world";
$var2=//some crazy large database query result
$var3=//some complicated function()

与选项#2:

$var0= array('hello', 'world');
$var0="hello world";
$var0=//some crazy large database query result
$var0=//some complicated function()
  1. 它是否取决于现有变量的内存大小?即,重新分配内存是否比分配新变量在计算上更昂贵?
  2. 这是否总是一个范围问题,这意味着仅当您不需要此处显示的范围之外的每个变量值时才应使用 Option#2?
  3. 它是否取决于每个变量的值是什么?重新分配给不同的数据类型是否有不同的相关成本?
4

3 回答 3

5

从技术上讲,重用变量会(微不足道)更快。不过,这将使可测量的性能差异为零。

虽然硬件变得更便宜,时间也变得更贵,但您更应该寻找可维护的代码。从长远来看,这将为您节省头痛和贵公司的资金。

仅在可以获得足够性能增益以抵消您投入其中的工作量(金钱)的地方进行优化。

在云和服务器集群的今天,稍微优化一点的代码最终很可能不会使项目变得更慢。您的项目更有可能运行得一样快,但会花费更多的 cpu 周期,因此您的托管服务提供商会花费更多的钱。不过,这一微小的额外成本很可能不会影响长达数小时的性能提升优化。当然,除非你问这个是因为你正在为亚马逊开发。(即使在像亚马逊这样的地方,每天有数百万次点击,重用变量也不会带来任何显着的性能提升)

回到你的问题;我相信你应该只重用一个变量,当它包含原始状态的更新内容时。但总的来说,这种情况不会发生太多。

我认为在以下情况下,重用$contentvar 是合理的选择

function getContent()
{
    $cacheId = 'someUniqueCacheIdSoItDoesNotTriggerANotice';
    $content = someCacheLoadingCall( $cacheId );

    if (null === $content) {
        $content = someContentGeneratingFunction();

        someCacheSavingCall( $cacheId, $content);
    }

    return $content;
}

描述性代码

另外,请善待未来的自己,始终为变量使用描述性名称。你会为此感谢自己。当你与自己达成协议,除非它在逻辑上有意义,否则永远不要重用变量,你就朝着可维护代码又迈出了一步。

想象一下,从现在起的 6 个月内,在您完成另一个大项目 - 或更小的项目之后 - 您接到一个重要客户的电话,说旧项目中存在错误。神圣的!@#!必须马上解决!您打开并到处看到这样的功能;

function gC()
{
    $cI = 'someUniqueCacheIdSoItDoesNotTriggerANotice';
    $c  = sclc( $cI );

    if (null === $c) {
        $c = scg_f();
        scsc( $cI, $c);
    }

    return $c;
}

使用描述性变量和函数名称以及获得具有良好代码完成功能的代码编辑器要好得多,因此您仍然可以尽可能快地进行编码。现在,我会推荐Aptana StudioZend Studio,Zend 的代码完成要好一些,但 Aptana 已被证明更稳定。

PS。我不知道你的编程水平,如果我喋喋不休,抱歉。如果与您无关,我希望能帮助其他可能阅读此内容的人:)

于 2012-08-25T16:00:32.970 回答
4

永远不应该使用选项#2。为不相关的代码块重用变量是一种糟糕的做法。您甚至不应该处于可以使用选项 #2 的情况。如果您的函数太长以至于您要完全更改上下文并解决一些不同的问题,您应该将您的函数重构为更小的单一用途函数。

在不再使用旧值之后,您永远不应该出于“回收”它们的愿望而重用变量。如果一个变量不再是,如果您正确地构建您的软件,它自然应该超出范围。您的决定应该与性能或内存优化无关,它们都不受变量命名的影响。选择变量名称时,您唯一考虑的应该是生成可维护、稳定的代码。

您甚至在问自己是否重用变量这一事实意味着您使用的名称过于通用。var0像等变量名var1可怕的。您应该根据变量实际包含的内容命名变量,并在需要存储新值时声明新变量。

于 2012-08-25T15:55:12.903 回答
4

我个人会说你永远不应该重新分配一个变量来包含不同的东西。这使得调试非常困难。如果您担心内存消耗,您可以随时使用unset()变量。

另请注意,您永远不应该拥有变量名称$var#。您的变量名应该描述它所包含的内容。

归根结底,这一切都是为了尽量减少代码中 WTF 的数量。选项二是一个很大的WTF。

它是否取决于现有变量的内存大小?即,重新分配内存是否比分配新变量在计算上更昂贵?

这是关于限制您和其他人(重新)查看您的代码的 WTF 数量。

这是否总是一个范围问题,这意味着仅当您不需要此处显示的范围之外的每个变量值时才应使用 Option#2?

好吧,如果它在完全不同的范围内,那么如果您使用相同的名称多个名称就可以了。只要清楚变量包含的内容,例如:

// perfectly fine to use the same name again. I would go as far as to say this is prefered.
function doSomethingWithText($articleText)
{
    // do something
}

$articleText = 'Some text of some article';
doSomethingWithText($articleText);

它是否取决于每个变量的值是什么?重新分配给不同的数据类型是否有不同的相关成本?

不是成本问题,而是可维护性问题。这通常更为重要。

于 2012-08-25T15:55:50.837 回答