2010-11-15 53 views
3

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

我特别感兴趣的原因是/不是很好的做法,因为我除了我自己,如果我应该或不应该这样做。

例如,$i是在循环中用于遍历事物的最常用变量之一。

EG(在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 

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

我知道重新使用一个变量可以节省很少量的内存,但是当这些变量叠加时,变得很重要,不是吗?

非常感谢您提供任何直接的答案,如果这个问题过于模糊,我表示抱歉并希望知道这一点,以便我知道我应该在其他地方提出这些问题。

+1

你在说变量,而不是“字符串”。字符串是一系列字节,通常表示字符。 – Santa 2010-11-15 18:58:07

+0

* Facepalm *我的道歉..该帖子已按照编辑。 – Partack 2010-11-15 19:02:43

回答

1

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

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

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

将索引变量用于互斥循环是一个好主意;它使你的代码更易于理解。如果你声明了许多额外的变量,其他人阅读你的代码可能会怀疑,即使你的循环完成后,“我”仍然被用于某些事情。

重用它! :)

+0

感谢您的回复。有一件事我想指出的是,每次都不会有额外的代码重新设置变量来增加脚本的文件大小?通常情况下,这不是一个真正的问题..但是如果你只有几个kb的工作和一个有很多循环的脚本作为最坏的情况呢? – Partack 2010-11-15 19:12:38

+1

不要担心脚本大小。您的脚本不会直接放入内存中。它正在被解释,并且(取决于你的语言)可能被编译。你的脚本行正被翻译成你无法合理预测的一吨字节码指令。如果你遇到过内存受限的情况,你应该使用低级语言,例如汇编或C语言。 – Brendan 2010-11-15 19:17:45

2

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

不幸的是,变量处理的方式是高度的语言和编译器特定的。如果你给我们更多的细节,你会得到更好的信息。

大多数语言都有范围的概念,在声明中分配变量空间,在范围结束时释放变量空间。如果将变量保留在适当的范围内,则不必担心浪费内存,因为变量在不再需要时会被释放。再次,范围的细节是语言相关的。

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

2

在进入您的foreach循环之前,您应该将$i初始化为0,无论您是否在函数的前面使用它,也不管您使用的是哪种语言。这简直是​​一种语言中立的最佳实践。

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

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

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

此外,在问候你的语句:

我知道,再利用一个变量可能保存少量的内存,但是当这些变量叠加时,它变得重要,不是吗?

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

+0

哦,是的..它在循环之前比之后设置更有意义..谢谢=) – Partack 2010-11-15 19:05:29

1

就个人而言,我没有任何问题重新使用索引/计数器变量 - 尽管在某些语言中,例如.Net,在for循环中使用变量专门将变量作用于该循环 - 因此它被清理后没有有什么关系。

你不应该永远再使用含有任何显著的数据(这不应该是为所有的变量应该有描述性的名称问题)

我曾经尝试清理一些Excel宏变量由学生编写的代码 - 所有变量名都是希腊神,并且在整个剧本中重复使用它们。最后,我只是重新写了它。

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

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

实际上会分配一个新的内存区域来存储第二使用和改变MyString指针在新的位置点。顺便说一句,这就是为什么以下效率非常低(至少在英寸。网):

Dim SomeString = SomeVariable & " " & SomeOtherVariable 

这对于SomeVariableSomeVariable + " "然后更多的内存,然后又再次SomeVariable + " " + SomeOtherVariable分配内存 - 这意味着SomeVariable实际写入内存的3倍。

总之,我会重复使用非常简单的循环变量。除此之外,我只是分配一个新的变量 - 尤其是因为内存分配通常只是大部分应用程序的时间/处理的一小部分。

记住:Premature optimization is the root of all evil

+0

非常感谢你的意见,这对我来说很有意义=)我刚刚阅读唐纳德克努特(那个人说的那句话)。多么伟大的人。我会记得那个! – Partack 2010-11-15 20:09:25

+0

欢迎。我熟悉Knuth,但希望SO Q会更有用:) – Basic 2010-11-15 20:33:45

1

这取决于你要解决的问题。

当使用PHP(以及其他脚本语言)时,应该考虑使用unset()方法设置大小可变的变量,如数组或长字符串。你不应该打扰重新使用或取消设置小变量(整数/布尔/等)。使用(慢速)脚本语言时,这并不值得。

如果您正在开发一个低(低)级语言(如C)的性能关键应用程序,那么变量重用更重要。

+0

谢谢,区分是否回收不同语言之间的变量是我的一个亟待解决的问题 - 你几乎总结了一些问题=) – Partack 2010-11-15 20:13:06