ActionScript 3中循环的变量声明性能

Con*_*uza 5 performance actionscript-3 low-level

尽管有关于这个问题的所有已知博客我总是怀疑一些结果,我的个人测试表明,良好的标准并不是最好的.

在循环内声明变量,使它们接近其范围,并使方法更快到达,但分配更多内存或在for scope范围外声明以节省内存分配,但增加处理以在远程实例中迭代.

我的结果显示方法B更快(有时),我想知道这个背景.

结果各不相同,我不是一个有点brusher的大师.

那你们怎么想呢?

方法A.

var object:Object = new Object();
var loop:int = 100000
for (var i:int = 0; i < loop; i++)
{
    object = new Object();
    object.foo = foo;
    object.bar = bar;
}
Run Code Online (Sandbox Code Playgroud)

要么

方法B.

var loop:int = 100000
for (var i:int = 0; i < loop; i++)
{
    var object:Object = new Object()
    object.foo = foo;
    object.bar = bar;
}
Run Code Online (Sandbox Code Playgroud)

tas*_*oor 11

AS3编译器将所有变量声明移动到方法的顶部,称为变量提升.变量的最小范围是一个完整的方法.您的方法B等同于以下内容:

var loop:int = 100000;
var i:int;
var object:Object;
for (i = 0; i < loop; i++) {
    object = new Object();
    object.foo = foo;
    object.bar = bar;
}
Run Code Online (Sandbox Code Playgroud)

请注意,它只会向上移动声明,而不是与之关联的赋值.这是您在使用后声明变量的原因.例如,尝试以下代码:

trace(a);
var a:int = 10;
trace(a);
Run Code Online (Sandbox Code Playgroud)

这将编译.这是因为这段代码相当于:

var a:int;
trace(a);
a = 10;
trace(a);
Run Code Online (Sandbox Code Playgroud)

这也是您将使用以下代码获得重复变量声明警告的原因:

for (var i:int = 0; i < m; i++) {

}
for (var i:int = 0; i < n; i++) { // i is already declared once

}
Run Code Online (Sandbox Code Playgroud)

AS3中的变量范围概念,JS与C,C++,Java等不同.

  • @Conrado Souza,SO是通过互相帮助来分享知识和学习的.它永远不会被接受或获得更高的声誉,它们只是副产品.我尽我所能,这并不意味着我提供了最好的答案. (5认同)
  • 不过,我比这更喜欢这个答案.得到我的+1. (2认同)
  • 唉唉!所以这就是为什么你不能在第二个循环中再次声明.感谢您指出了这一点! (2认同)

小智 9

tldr; 它们在语义上是等价的,并且表现相同.

两种情况下都只有一个变量被调用.ActionScript,如JavaScript,"提升"声明.也就是说,它实际上只是一个函数范围的注释.这与C和Java的不同之处在于,在第二种情况下创建一个新范围(以及新变量).objectvar

然而,AS没有区别.引擎有效地处理与第一个相同的第二个代码.(话虽如此,我更愿意"保持var关闭"它所使用的位置,而理解它与范围无关,并且与性能无关.)

请参阅Action Script 3.0:Variables,特别是Scope部分:

变量的范围是代码区域,其中变量可以通过词法引用访问...在ActionScript 3.0中,变量始终被赋予声明它们的函数或类的范围.

快乐的编码.