Объявление переменной производительности на циклы в ActionScript 3


Несмотря на все известные блоги по этому вопросу, я всегда сомневаюсь в некоторых результатах, и мои личные тесты показывают, что хорошо упомянутый стандарт не является лучшим.

Объявление переменных внутри цикла, чтобы держать их близко к его области видимости и сделать его быстрее, чтобы быть достигнутым методом, но выделяя больше памяти или объявляя вне цикла. ибо область для сохранения выделения памяти, но увеличения обработки для итерации в удаленном экземпляре.

Мои результаты показывают, что метод B является быстрее(иногда), я хочу знать предысторию вокруг этого.

Результаты различаются, и я ни капли не брушер гуру.

Так что вы ребята думаете об этом?

Метод А

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;
}

Или

Способ В

var loop:int = 100000
for (var i:int = 0; i < loop; i++)
{
    var object:Object = new Object()
    object.foo = foo;
    object.bar = bar;
}
2 5

2 ответа:

Tldr; они семантически эквивалентны и выполняют идентичные функции.

Существует только Одна переменная, называемая object в обоих представленных случаях. ActionScript, как и JavaScript," поднимает " объявления. То есть var является на самом деле просто аннотацией с областью действия. Это отличается от C и Java, где во втором случае была бы создана новая область видимости (и, следовательно, новая переменная) .

Однако в AS нет никакой разницы. Двигатель эффективно трактует 2-й код идентично первому. (При этом я предпочитаю "держать var близко" к тому, где он используется, понимая, что он не имеет отношения к области применения и не имеет отношения к производительности.)

Смотрите сценарий действий 3.0: переменные и, в частности, раздел Scope:

Область видимости переменной - это область кода, в которой переменная может быть доступна с помощью лексической ссылки... В 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;
}
Обратите внимание,что он только перемещает объявление вверх, а не связанное с ним назначение. Именно поэтому вы можете объявить переменную после ее использования. Например, попробуйте этот код:
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

}
Понятие переменной scope в AS3, JS отличается от понятия C, C++, Java и т. д.