Game Maker - создание игр | HellRoom Games
Ноябрь 16, 2025, 03:35:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Серия статей: Оптимизация Javascript  (Прочитано 3791 раз)
0 Пользователей и 1 Гость смотрят эту тему.
artem73
Новичок
*

Репутация: 1
Offline Offline

Пол: Мужской
API: Tululoo
Деятельность: Всем
Сообщений: 12


Композависимый 15lvl


« : Июль 09, 2012, 23:32:29 »

Внимание! Данная серия статей сделана для сайта tululoo.ru и ее автором являюсь я. Без моего разрешения вы не имеете права на публикацию этих статей где-то еще.

Оптимизация Javascript: Статья первая. Факты.
Недавно стал задумываться: на технологию HTML5 возлагают такие надежды, но ведь все зависит не только от технологии, но и от программиста. Ведь не только нужно сокращать и упрощать графическую часть, но и грамотно использовать управляющую, а именно, JavaScript.

Найдя в интернете сервис для тестирования скриптов и методов javascript, http://jsperf.com, я протестировал наиболее часто используемые в играх участки кода. Тестирование проводилось на двух совершенно разных компьютерах, в двух браузерах: Firefox и Chrome. Вот, что получилось(приготовьтесь к скупым фактам ;)):

Старый ноутбук(5 лет, Windows XP) - Браузер Firefox:
1) Действия с глобальными переменными комнаты гораздо быстрее, чем с переменными объекта.

2) Расположение различных видов сравнений и switch по убыванию скорости выполнения:
   I) if (t === 'b') { r='b'; } else if (t === 'e'){ k='b'; }
   II) if (t === 'b') { r='b'; }
   III) if (t == 'b') { r='b'; }
   IV) t === 'b' && (r = 'b');
   V) if (t == 'b') { r='b'; } else if (t == 'e'){ k='b'; }
   VI) switch(t){ case 'b':r='b';break; case 'e':k='b';break;}

3) Сравнение быстродействия операций ++x; , x=x+1; , x+=1; , x=1+x; и x++; показало, что они все примерно равны по быстроте выполнения.

4) Перебор массива с помощью for гораздо быстрее, чем с помощью while.

Старый ноутбук(5 лет, Windows XP) - Браузер Chrome:
1) Глобальные переменные комнаты гораздо быстрее, чем переменные объекта(т.е. их изменение, проверка и т.д.).

2) Расположение различных сравнений и switch по убыванию скорости выполнения:
   I) if (t == 'b') { r='b'; }
   II) if (t == 'b') { r='b'; } else if (t == 'e'){ k='b'; }
   III) if (t === 'b') { r='b'; } else if (t === 'e'){ k='b'; }
   IV) if (t === 'b') { r='b'; }
   V) t === 'b' && (r = 'b');
   VI) switch(t){ case 'b':r='b';break; case 'e':k='b';break;}

3) Сравнение быстродействия операций ++x; , x=x+1; , x+=1; , x=1+x; и x++; (убывание быстроты выполнения):
   I)++x;
   II)x=x+1;
   III)x+=1;
   IV)x=1+x;
   V)x++;

4) Перебор массива с помощью for гораздо быстрее, чем с помощью while)

Стационарный комьютер(Windows 7, довольно новый) - Браузер Firefox:
1) Переменные объекта на 97% (97 - это очень много, поверьте) медленнее, чем глобальные переменные.

2) Расположение различных сравнений и switch по убыванию скорости выполнения:
   I) if (type === 'boolean'){r = 'boolean';}
   II) if (type === 'boolean'){r = 'boolean';}else if(type === 'function'){r = 'function';} - на 0.06% медленнее.
   III) type === 'boolean' && (r = 'boolean'); - на 12% медленнее.
   IV) if (type == 'boolean'){r = 'boolean';}else if(type == 'function'){r = 'function';} - на 21% медленнее.
   V) if(type == 'boolean'){r = 'boolean';} - на 40% медленнее.
   VI) switch{case 'b':r='b';break; case 'e':k='b';break;} - на 91% медленнее.

3) При сравнении x++; , x+=1; , x=x+1; , ++x; и x=1+x; выяснилось, что все примерно равны, кроме
x=1+x, который на 33% отстает от соперников(непонятно, почему).

4) Перебор массива с помощью for всего на 9% быстрее, чем с помощью while.

Стационарный комьютер(Windows 7, довольно новый) - Браузер Chrome:
1) Локальные переменные объекта в Google Chrome уступают на 89% глобальным переменным комнаты.

2) Расположение различных сравнений и switch по убыванию скорости выполнения:
   I) if (type == 'boolean'){r = 'boolean';}else if (type == 'function'){r = 'function';}
   II) if (type === 'boolean'){r = 'boolean';}else if(type === 'function'){r = 'function';} - 1% медленнее
   III) type === 'boolean' && (r = 'boolean'); - 29% медленнее
   IV) if (type === 'boolean'){r = 'boolean';} - 32% медленнее
   V) if(type == 'boolean'){r = 'boolean';} - 40% медленнее
   VI) switch - 91% медленнее

3) Сравнение быстродействия операций ++x; , x=x+1; , x+=1; , x=1+x; и x++; в хроме ничего не дало... Тест в этом браузере все время показывает разный результат о_О

4) Перебор массива с помощью for или while: Особой разницы для хрома нет...


[h]Итоги:[/h]
Подведем итоги и составим советы по оптимизации javascript-кода:
1) Если есть возможность, заменяйте this.peremennaya на peremennaya.
2) Избегайте switch! Ставьте вместо него, что посчитаете нужным, но никогда не используйте switch!
3) Насчет извечных соревнований x+=1 и x=x+1 ничего точного сказать не могу(Лучше, просто не используйте выражения вида x=N+x;)
4) Перебирайте массивы с помощью for, вообще лучше использовать for вместо while, там, где это возможно.

А еще, решите для себя: для каких компьютеров(или телефонов) вы делаете игры. Определитесь с целями, все просчитайте. Да, не все имеют ПК с 2гб оперативной памяти и хорошим процессором. С другой стороны, мало кто установит на старый комп самую новую версию браузера и станет искать в интернете html5 игры(ну, кроме меня :D). Да и телефоны разные бывают.

Надеюсь, что моя статья чем-то вам помогла(или еще больше запутала :P).
Всем удачи =)
Записан

Деятельность: делаю мануалы и расширения для Tululoo; программирую; разрабатываю защиту для javascript.
Языки программирования: PHP, Javascript, GML, Pascal.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.12 секунд. Запросов: 30.