Какие из этих параметров приведут к получению лучшего / более производительного кода ActionScript? - PullRequest
0 голосов
/ 10 сентября 2011

Я читал об оптимизации кода (точнее, оптимизации кода для ActionScript 3), и у меня есть несколько вопросов.

  1. Что лучше, отрицательные циклы (то есть обратный отсчет в циклах и проверка, достигли ли вы нуля) или циклы foreach? Оба варианта кажутся лучше, чем обычные циклы «for», но какой из них быстрее?

  2. Что лучше, используя числа или целые числа?

  3. Действительно ли постоянная снижает вашу производительность?

Я пытался написать простой код и сам тестировать его, но результаты были повсюду, и некоторые из посещенных мной сайтов имели противоречивые мнения!

Ответы [ 2 ]

2 голосов
/ 10 сентября 2011

"1) Что лучше: отрицательные циклы (т. Е. Подсчет в циклах назад и проверка, достигли ли вы нуля) или циклов foreach? Обе опции кажутся лучше, чем обычно, для циклов for, но быстрее два? "

По foreach, я собираюсь предположить, что вы имеете в виду для ... каждого или для ... в циклах. Как отметил Демьян, forEach работает довольно медленно. Для других выполнение простого цикла for всегда происходит быстрее (вы можете заблаговременно из всех, за исключением каждого, я думаю), просто возвращаясь, когда вы нажимаете нужную проверку). Делаете ли вы i ++ или i-- не имеет значения. for..each и for..in циклы имеют свои преимущества, хотя. for..in - единственный способ, которым вы можете перебирать объекты Dictionary и Object, в то время как for..each выполняет приведение для вас, то есть вы пишете меньше кода. Как в:

for each( var s:Sprite in this.m_mySpriteVector )
    ...

против

var len:int = this.m_mySpriteVector.length;
for( var i:int = 0; i < len; i++ )
    var s:Sprite = this.m_mySpriteVector[i];

(если заметить, если вы делаете нормальный цикл for, то сокращение длины - лучшее, что вы можете сделать, чтобы ускорить его). Также обратите внимание, что разница в скорости для циклов действительно имеет значение, только если они большие. Если вы делаете цикл из 10, то на самом деле не имеет значения, какой вы выберете.

"2) Что лучше, если использовать числа или целые числа?"

Если вы имеете в виду циклы, то всегда переходите к int. Другими словами, используйте класс, представляющий то, что вам нужно. Если вам нужны только целые числа, используйте int или uint. Если вам нужны десятичные дроби, тогда перейдите на Number. Используйте неправильный тип, и вы получите небольшой штраф, но не огромный. Кроме того, в зависимости от того, что вы держите в переменной, это может быть не тот тип, который вы думаете: http://jacksondunstan.com/articles/1357

"3) Действительно ли постоянная снижает вашу производительность?"

Я на самом деле не проверял это, но, вероятно, недостаточно, чтобы действительно иметь значение. Сделайте простой цикл, используя 1 000 000 итераций или что-то в этом роде, и посмотрите, имеет ли это значение. Использование статического const повлечет за собой небольшое наказание, так как оно должно выполнять поиск класса, но это не резко


Последнее, что нужно сделать, это быть осторожным с оптимизацией. Также имейте это в своей голове, чтобы вы не писали отстойный код, но будьте осторожны, где вы его применяете. Оптимизированный код обычно занимает больше времени для написания и менее читабелен, чем другой код (хороший пример - цикл for..each).

Примите во внимание, где используется каждый фрагмент кода. Если это то, что называется критичным по производительности кодом - код, который вызывается постоянно (ENTER_FRAME или обычные функции), то именно на этом вы должны сосредоточить свои усилия. Если это функция, которая вызывается один раз или не очень часто, то время, потраченное на ее оптимизацию, будет напрасной тратой, поскольку вы получаете от нее очень мало пользы.

1 голос
/ 10 сентября 2011

1), что лучше, отрицательные циклы (то есть обратный отсчет в циклах и проверка, если вы достигнете нуля) или циклы foreach. Оба варианта кажутся быть лучше, чем обычно, для циклов for, но я хочу знать, что быстрее из двух?

Все зависит от вашей логики. Если у вас есть условие выхода, которое будет выполнено быстрее при уменьшении, тогда отрицательный путь - это путь. Что касается forEach, я предполагаю, что это зависит от того, как вы его используете. В качестве примера возьмем следующее:

A

var vec:Vector.<String> = new Vector.<String>();
vec.forEach(function(s:String, idx:int, v:Vector.<String>):void {
    trace(s);
});

B

function onIteration(s:String, idx:int, v:Vector.<String>):void {
    trace(s);
}
var vec:Vector.<String> = new Vector.<String>();
vec.forEach(onIteration);

В A , если только компилятор Flash не проводит удивительных оптимизаций (и я уверен, что нет), новая анонимная функция создается на на каждой итерации , что очевидно будет дороже, чем простой цикл for.

B уже имеет определенную функцию, так что это просто дополнительный поиск для вызова функции. Я бы предположил, что различия в производительности между этим и обычным циклом for минимальны, если вообще существуют (хотя и не профилировали его).

2) Что лучше, используя числа или целые числа?

Это зависит от вашего конкретного случая. Если вам требуется число с плавающей запятой, используйте Number. В противном случае используйте int. Если ваше значение никогда не будет отрицательным, используйте uint. Я бы предположил, что вычисления AVM2 будут быстрее с int с и uint с, чем с Number, поскольку нет операций с плавающей запятой, которые выполняются, но я не профилировал их, поэтому я не уверен на 100%.

3) Действительно ли постоянная снижает вашу производительность?

Я никогда ничего не слышал о предмете. Я не мог видеть, как это делает переменную только для чтения. Если есть какая-либо разница, это будет почти ничего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...