PDA

Просмотр полной версии : Нужна ли переменная в данном коде?


Srednas
15.06.2012, 13:42
Здравствуйте.
Копался в чужом коде и наткнулся на такой цикл:

for (var i:int = 0, j:int = 0; i < num; i++) {
object.s[j++] = data.readFloat();
object.s[j++] = data.readFloat();
}


Я не понимаю для чего нужна «j». Может объяснит кто, какой в ней смысл?

Wolsh
15.06.2012, 14:10
Так красивее? Понятнее?
for (var i:int = 0; i < num * 2; i += 2) {
object.s[i] = data.readFloat();
object.s[i+1] = data.readFloat();
}

expl
15.06.2012, 14:38
Вероятно, можно было бы и так:

for (var i:int = 0; i < num; i++) {
object.s.push(data.readFloat());
object.s.push(data.readFloat());
}

Только выполнятся будет в пару раз дольше, а код, видимо, был критичным.

udaaff
15.06.2012, 14:51
Мне непонятен смысл данной конструкции :) Возможно, конечно, код вырван из контекста.

Srednas
15.06.2012, 16:10
Только выполнятся будет в пару раз дольше, а код, видимо, был критичным.


// 1
t = getTimer();
for (var i:int = 0, j:int = 0; i < max; i++) {
v[j++] = 10;
v[j++] = 10;
}
t = getTimer() - t;
trace("1: "+ t); // 49
// 2
v = new Vector.<uint>;
t = getTimer();
for (var k:int = 0; k < max*2; k += 2) {
v[k] = 10;
v[k+1] = 10;
}
t = getTimer() - t;
trace("2: "+ t); // 44
// 3
v = new Vector.<uint>;
t = getTimer();
for (var n:int = 0; n < max; n++) {
v.push(10);
v.push(10);
}
t = getTimer() - t;
trace("3: "+ t); // 152


Получилось, что 2 вариант быстрее. Выходит, первый — лишь «для красоты»?

expl
15.06.2012, 16:49
49 и 44 - можно сказать что разницы нет.
Вообще да, для красоты. Но Вы пишите так, как понятнее Вам и вашим коллегам.
Например один товарисч (и я за ним) ничуть не смущались, выравнивая картинку по центру таким образом (с округлением координат):
bitmap.x = int(areaWidth - bitmap.width) >> 1;
Но другие коллеги раздражались и пришлось писать так:
bitmap.x = int((areaWidth - bitmap.width) * .5);
Впринципе, я к этой записи прывык и мне все равно каким способом. Зато коллеги не раздражаются.

Eщё с первым способом проще править тело цикла, это фактически аналог push().

etc
17.06.2012, 13:37
Srednas, если тест написан в первом кадре в IDE, тест заведомо ничего не показывает.

udaaff
17.06.2012, 18:18
А где нужно тесты располагать? И от чего это зависит?

etc
18.06.2012, 12:34
А где нужно тесты располагать? И от чего это зависит?

Обернуть весь код в функцию и вызывать. В противном случае разница в скорости инкремента по полям искажает результаты теста.

i.o.
18.06.2012, 22:21
Да и в релизном плеере не помешало бы запустить.
trace как бы намекает на дебаг-версию...