Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Actionscript 3中循环的变量声明性能_Performance_Actionscript 3_Low Level - Fatal编程技术网

Performance Actionscript 3中循环的变量声明性能

Performance Actionscript 3中循环的变量声明性能,performance,actionscript-3,low-level,Performance,Actionscript 3,Low Level,尽管大家都知道关于这个问题的博客,但我总是对一些结果表示怀疑,我的个人测试结果表明,这套说得好的标准并不是最好的 在循环内声明变量,使其接近其作用域,并使方法更快地访问变量,但分配更多内存,或在作用域外声明以节省内存分配,但增加处理以在远程实例中迭代 我的结果显示方法B更快(有时),我想知道这方面的背景 结果各不相同,我不是一个有点刷大师 你们怎么看 方法A var对象:对象=新对象(); 变量循环:int=100000 for(变量i:int=0;i

尽管大家都知道关于这个问题的博客,但我总是对一些结果表示怀疑,我的个人测试结果表明,这套说得好的标准并不是最好的

在循环内声明变量,使其接近其作用域,并使方法更快地访问变量,但分配更多内存,或在作用域外声明以节省内存分配,但增加处理以在远程实例中迭代

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

结果各不相同,我不是一个有点刷大师

你们怎么看

方法A

var对象:对象=新对象();
变量循环:int=100000
for(变量i:int=0;i

方法B

var循环:int=100000
for(变量i:int=0;i
tldr;它们在语义上是等价的,并且执行相同的操作

在这两种情况下,只有一个变量称为
object
。ActionScript和JavaScript一样,“提升”声明。也就是说,
var
实际上只是一个函数范围的注释。这与C和Java不同,在C和Java中,第二种情况下会创建一个新的作用域(从而创建新的变量)

然而,AS没有区别。发动机有效地处理与第一个代码相同的第二个代码。(也就是说,我更喜欢“保持
var
接近”它的使用位置,同时理解它与范围无关,对性能没有影响。)

请参见和,尤其是范围部分:

变量的作用域是代码中可以通过词法引用访问变量的区域。。。在ActionScript 3.0中,变量总是被分配到声明它们的函数或类的范围。


愉快的编码。

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;
}
这将编译。这是因为该代码相当于:

var a:int;
trace(a);
a = 10;
trace(a);
这也是您将获得重复变量声明警告的原因,警告代码如下:

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

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

}
for(变量i:int=0;i

<> P3,变量在AS3、JS中的作用不同于C、C++、java等./p>,我看到变量实例数等于循环声明中的循环数。lace@ConradoSouza这是错误的。请参阅链接
var
不是AS/JavaScript中的声明(在C/Java意义上)。它是一个功能范围的注释。也就是说,它被“提升”并应用于功能范围。(从技术上讲,它被称为声明;但是,我要指出的是,当“行运行”时,它不会“声明”任何东西。)@ConradoSouza这种行为可以被视为在循环之外(甚至在
var对象
行的上方!),
对象
是可访问的,并且将分配最后一个值。明白,由于我与C#开发者就这个问题进行了争论,他们对这个问题的观点在技术上与Actionscript3开发者的观点不同。现在我们了解了作用域差异和编译器中发生的变量提升,我们可以得出结论,我们无法在ActionScript中比较方法A和B的性能,但是在另一个环境(如C/C++)中考虑这一点,我认为方法A的执行速度将快于BI,我只想确保我正确理解这一点:如果在函数内部声明同一个变量两次,一次在for循环之前,一次在for循环内部,绝对没有变量隐藏、冗余等,除了在两个不同的点上有var和:可能。这是正确的吗?看看实际执行的测试,看看它们是否有效、可重复,并显示所断言的内容,这将是很有趣的。很难获得正确的微基准测试(仅上述代码片段是不够的)。在嵌套范围(例如嵌套函数)内声明变量并为其赋值以避免在[[scope]]链中搜索时,有一些(尽管通常不合理)参数,但这是另一种情况,需要观察新的[[scope]]。方法B速度更快,因为它中的新变量更少。在这里花时间的是新的陈述。Taskinoor,你的答案和pst one一样正确,然而,他的答案包含了更多的技术知识,这正是我所寻找的,可能任何涉及这个问题的人也会寻找它。@Conrado Souza,通过互相帮助分享知识和学习也是如此。这与被接受或获得更高的声誉无关,它们只是副产品。我尽了最大努力,但这并不意味着我提供了最好的答案。不过,我更喜欢这个答案。得到我的+1。啊!这就是为什么不能在第二个循环中再次声明。谢谢你指出这一点@1978年的那一刻,实际上你可以,我们在这里看到的是,它没有任何区别:p,可能只是通过强制编译器调整代码来稍微增加编译时间。
trace(a);
var a:int = 10;
trace(a);
var a:int;
trace(a);
a = 10;
trace(a);
for (var i:int = 0; i < m; i++) {

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

}