任何语言:回收变量

时间:2010-11-15 18:54:46

标签: scripting variables benchmarking recycle

这似乎是一个简单的问题,但是,在任何脚本语言中重用变量通常是一个好主意吗?

我特别感兴趣的是它为什么不是好习惯的原因,因为如果我应该或不应该这样做,我就是我自己。

例如,$i是循环中用于迭代事物的最常见变量之一。

E.g(在php中):

//This script will iterate each entry in $array 
//and output it with a comma if it isn't the last item.

$i=0;    //Recycling $i

foreach ($array as $v) {
    $i++;

    if ($i<count($array))
    {
        echo $v.', ';
    }
    else {
        echo $v;
    }
}

假设我的脚本中有多个循环,重新使用$i或仅使用$a之类的其他变量以及其他任何循环来自$b是否更好?到$z

显然要重用$i,我必须在循环之前设置$i=0;null,否则稍后会在脚本中给出一些非常奇怪的行为。这让我想知道重用它是否值得麻烦..

以下会占用更多空间而不仅仅是使用另一个变量吗?

$i=0;    //Recycling $i

当然这是最简单的使用示例,我想知道脚本是否非常复杂,是否会造成比它值得更多的麻烦?

我知道重新使用变量可以节省少量内存但是当这些变量堆积起来时,它变得很重要,不是吗?

感谢你提前做出任何直接答案,如果这个问题太模糊,我道歉并想知道这一点 - 所以我知道我应该在其他地方提出这些问题。

5 个答案:

答案 0 :(得分:2)

我认为你的“字符串”与“变量”混淆了。字符串是ASCII或Unicode字符的集合,具体取决于编程语言。变量是内存中的命名位置。所以你在谈论回收变量,而不是字符串。

不幸的是,处理变量的方式是高度语言和编译器特定的。如果您向我们提供更多详细信息,您将获得更好的信息。

大多数语言都具有范围的概念,可变空间在声明处分配,并在范围结束时解除分配。如果将变量保持在适当的范围内,则不必担心浪费内存,因为变量将在不再需要时被释放。同样,范围的细节依赖于语言。

通常,重复使用这样的变量名称是一个坏主意,因为当你忘记将变量重置为同一范围内的某个初始值时,你的程序将在运行时中断。

答案 1 :(得分:2)

在进入foreach循环之前,您应该将$i初始化为0,无论您是否在函数中使用过它,而且无论您使用何种语言。它只是一种语言中立的最佳实践。

许多语言通过允许您将计数变量绑定到for循环的范围来帮助您强制执行此操作。 PHP的foreach提供了类似的机制,前提是您的数组基于0并且只包含数字键:

foreach ($array as $i => $v) {
    echo $v;

    if ($i + 1 < count($array))
        echo ', ';
}

另外,关于你的陈述:

  

我知道重新使用变量可以节省少量内存但是当这些变量堆积起来时,它变得很重要,不是吗?

不,它确实没有。当变量超出范围时,变量将被垃圾收集。几乎不可能(没有编程生成代码)在单个函数的过程中使用如此多的计数/临时变量,而内存使用非常重要。重用变量而不是声明新变量将对程序性能没有可测量的影响,并且几乎不会影响其内存占用。

答案 2 :(得分:1)

重置变量($ i = 0)不会占用更多空间。

当您声明一个变量(比如整数类型)时,会为该整数分配预定义的内存量,而不管其值是多少。通过将其更改回零,您只需修改该值。

如果声明一个新变量,则必须为其分配内存,并且通常它也会初始化为零,因此重置现有变量可能也不占用任何额外的CPU时间。

重复使用索引变量进行互斥循环是一个好主意;它使您的代码更容易理解。如果你宣布了很多额外的变量,那么阅读你的代码的其他人可能会怀疑即使你的循环完成后“i”仍然被用于某些东西。

重复使用! :)

答案 3 :(得分:1)

就个人而言,重复使用索引/计数器变量没有任何问题 - 尽管在某些语言中,例如.Net,在for循环中使用变量专门将变量范围限定为该循环 - 因此无论如何都会在之后清理它。

您不应该重复使用包含任何重要数据的变量(这不应该是一个问题,因为所有变量都应该有描述性名称)

我曾经不得不尝试清理学生写的一些excel宏代码 - 所有变量名都是希腊神,并且在整个脚本中反复交换使用。最后,我只是重写了它。

您还应该知道,根据变量的类型和您使用的语言,重新分配内容可能与创建新变量一样昂贵。例如,在.Net中,字符串是不可变的,所以这......

Dim MyString as String = "Something"
MyString = "SomethingElse"

实际上会分配一个新的内存区域来存储第二次使用,并将MyString指针更改为指向新位置。

顺便说一下,这就是为什么以下内容效率非常低(至少在.Net中):

Dim SomeString = SomeVariable & " " & SomeOtherVariable

SomeVariable分配内存,为SomeVariable + " "分配更多内存,然后再为SomeVariable + " " + SomeOtherVariable分配内存 - 意味着SomeVariable实际上已写入内存3次。

总之,我重复使用的循环的非常简单的变量。还有别的,我只是分配一个新的变量 - 特别是因为内存分配通常只是大多数应用程序的时间/处理的一小部分。

请记住:Premature optimization is the root of all evil

答案 4 :(得分:1)

这取决于您正在解决的问题。

使用PHP(和其他脚本语言)时,应考虑对大型变量(如数组或长字符串)进行unset()。你不应该费心去重复使用或取消设置小变量(整数/布尔/等)。使用(慢)脚本语言时,这是不值得的。

如果您正在使用低级(低级)语言(如C语言)开发性能关键型应用程序,则可变重用更为重要。