Объявление переменной производительности на циклы в 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 ответа:
Tldr; они семантически эквивалентны и выполняют идентичные функции.
Существует только Одна переменная, называемая
Однако в AS нет никакой разницы. Двигатель эффективно трактует 2-й код идентично первому. (При этом я предпочитаю "держатьobject
в обоих представленных случаях. ActionScript, как и JavaScript," поднимает " объявления. То естьvar
является на самом деле просто аннотацией с областью действия. Это отличается от C и Java, где во втором случае была бы создана новая область видимости (и, следовательно, новая переменная) .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);
Это также является причиной того, что вы получите повторяющееся предупреждение объявления переменной со следующим кодом:
Понятие переменной scope в AS3, JS отличается от понятия C, C++, Java и т. д.for (var i:int = 0; i < m; i++) { } for (var i:int = 0; i < n; i++) { // i is already declared once }