Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Оптимизация для скорости в общем (http://www.flasher.ru/forum/showthread.php?t=80543)

orangeline 01.06.2006 13:09

если говорить о технике программирования на as слышал что конструкция
with object {
...
}
(особенно если много обращений к св-вам и методам object'а) сильно замедляет алгоритм.
for-in так же работает медленнее чем for
вообще мне кажется что много-мало сложные функции лучще не полениться, написать самому, нежели исп. встроенные - они медленнее
пример был выше про Array.reverse()

JhAZZ 05.06.2006 08:14

Вот что я вынес из своей работы со флэшем
1. Функции надо вызывать как можно реже. Вобщем, как в ассемблере. Лучше 50 строчек кода накопировать, чем сделать цикл от 1 до 50

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

3. Лучше создавать промежуточные переменные для хранения адресов на хэш. То есть обращение типа
xxx.tr.mx.v+=xxx.tr.mx.dv

лучше привести к следующему:
var mx:Object=xxx.tr.mx;
mx.v+=mx.dv;

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

4. От длины имен переменных или функций скорость почти не зависит. Это просто best practice. Все равно все "имена" индексируются и к ним обращаются не по имени, а по цифрам индексов хэшей.

5. for in работает тормозно
6. Array.length тормозной, так что лучше сначала узнать его длину в переменную перед началом цикла
7. Жалеть память броузера зрителя и делать delete неиспользуемых объектов не нужно - все равно никто не оценит. Поэтому например если надо очистить Array - проще взять и переприсвоить ему new Array();
8. with притормаживает, потому что бегает по with-хэшу, затем по localvar-хэшу, затем по this-хэшу . Одним беганием больше. А ведь в this и with сидят ключи не только переменных, но и функций.

Мои выводы зиждятся на собственных наблюдениях и курсах программирования, где мы делали элементарные бинарные индексы

heilong 05.06.2006 10:51

1. про фунцкии верно, а unroll-нуть цикл в 50 строчек это уж совсем last resort для самого inner loop-а

4. мне казалось, best practice это разумный компромисс между длиной имён и их осмысленностью. в институте нас учили "переменные должны иметь мнемонические названия"

7. мне кажется, это неважно, т.к. в любом случае или сам их удалишь, или рано или поздно garbage collector их удалит

for in и with почти не использую. с with-ом вообще стрёмно, его разве что для Drawing API можно использовать, хотя мне сделать var p = my_movie_clip; p.beginFill(... не влом.

JhAZZ: вообще, дельные советы!

Скрипун 05.06.2006 13:50

Кто то тут говорил что своя реверсия массива быстрее работает... [censored]ЧистоЙ ВОДЫ!!! Я целый час извращался... в раза медленее!

А вот недавно узнал что Math.random тоже в 2-3 раза медленее работает чем random. Вот как...

Nirth 05.06.2006 14:07

Удалил лишние знаки препинания и плохие слова, Скрипун
1) Веди себя культурно,мы в обществе
2) Нервные клетки не востанавливаются

Бармалей 05.06.2006 18:01

Стандартный прием - если порядок обращения к элементам массива не важен, то лучше воспользоваться циклом while с обратной итерацией в условии:
Код:

var i = my_array.lendth;
for(i--){
        // здесь действия над элементом массива my_array[i]
}


KPaul 05.06.2006 19:01

to Скрипун
Если этот "кто-то" - я, то многое может зависеть от машины и версии плеера. (Возможно если машина довольно быстрая, то разница будет минимальная). У меня целик 1800, плеер 8,0,22,0.
Следующий код (в руте) давал довольно разные по значениям листинги:
Код:

var arr = [];
for(var i=0; i<200000; i++){
        arr[i] = 1;
}
var c=0;
this.onEnterFrame = function(){
        if(c>=9){
                delete this.onEnterFrame;
        }
        c++;
        var time1 = new Date().getTime();
        arr.reverse();
        //reverse(arr);
        var time2 = new Date().getTime();
        var result = time2-time1;
        trace(result);

}

function reverse(a:Array){
        var l = 0;
        var r = a.length-1;
        var t;
        while(l<r){
                t = a[l];
                a[l] = a[r];
                a[r] = t;
                ++l;
                --r;
        }
}

2634 3008 2977 3008 2992 3008 2961 2945 3024 3008
и соответственно 359 374 359 374 374 358 358 375 374 374
PS Ругаться действительно не хорошо... :)

iNils 05.06.2006 19:20

P4 3000 (HT)

родной: 1107, 1217, 1170, 1186, 1372, 1310, 1201, 1217, 1201, 1201

кустарный: 265, 249, 265, 266, 249, 265, 250, 249, 250, 265

__i 05.06.2006 21:05

Цитата:

Сообщение от JhAZZ
Вот что я вынес из своей работы со флэшем
1. Функции надо вызывать как можно реже. Вобщем, как в ассемблере. Лучше 50 строчек кода накопировать, чем сделать цикл от 1 до 50

это логично само по себе, во время цикла у тебя выполняеться "лишние" операции (увеличили счетчик, произвели сравнение, переместили "указатель" выполнямого кода)
Цитата:

Сообщение от JhAZZ
5. for in работает тормозно

Естественно, также если задать в качестве индекса у массива не целые числа....

Цитата:

Сообщение от JhAZZ
6. Array.length тормозной, так что лучше сначала узнать его длину в переменную перед началом цикла

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

Цитата:

Сообщение от JhAZZ
8. with притормаживает, потому что бегает по with-хэшу, затем по localvar-хэшу, затем по this-хэшу . Одним беганием больше. А ведь в this и with сидят ключи не только переменных, но и функций.


with - это вообще ужасная практика программирования!!!.

MrKIT 23.08.2006 08:31

Вложений: 1
Народ коли тут все за убыстренее посмотрите этот код скажите что тут заменить чтоб меньше тормозило...


Часовой пояс GMT +4, время: 09:40.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.