::: PHP.com.ua - учимся вместе. ::: ::: PHP.com.ua - учимся вместе. :::



 
   - Вакансия PHP-программист, Днепропетровск...
  - Проблема с передачей переменной в PHP ск...
  - Как хранить конфигурацию cms'ки?
  - Проблема с сортировкой массива
  - коллизии md5
  - Странный глюк функции date
  - Скроллинг в iframe


Главная
Новости
Статьи
Шпаргалки
Файлы
О проекте
Форум
Футболки


FREEhost.com.ua - купил хостинг 10 у.е. на Begun в подарок.

iName.com.ua - регистрация доменных имен и хороший хостинг.

Библиотека программиста - нужный вам исходник или документация по необходимому для вас языку программирования.

Designclub - Клуб дизайнеров Украины.

Регистрация доменов
Хостинг

 HowtoForge.ORG.UA - Это первый Украинский ресурс развития open source программного обеспечения


Путь: Статьи > Общие вопросы

Общие вопросы

Автор: - funduk
Дата публикации - 16.08.2005
Просмотров: - 4055

Оптимизация кода Javascript (и не только Javascript)


Линк нашел на opennet'e,

url=http://home.earthlink.net/~kendrasg/info/js_opt/]http://home.earthlink.net/~kendrasg/info/js_opt//url]

В статье описаны общие методы "построения" кода, которые могут быть применены не только к javascript'у, но и к другим (не только скриптовым) языкам программирования, в том числе и PHP :)

Я рассмотрю лишь те аспекты, которые мне показались интересными.
Тестировать можете сами на формах в ссылке
ну а PHP - у себя на компьютере или где-то еще :)

Мной проводились тесты:

javascript FF 1.0.4 & IE 6.0 OS:windows

PHP 4.4.0 OS:freeBSD

[p]1. Switch vs If-Then-Else[/p]

Сравнение производительности конструкций SWITCH и IF-ELSE IF
тестировался следующий код:

[code]
var x=20;
var y=0;

for (var i=0; i < 100000; i++) {

if (x == 0) {y = x}
else if(x == 1) {y = x}
else if(x == 2) {y = x}
else if(x == 3) {y = x}
else if(x == 4) {y = x}
else if(x == 5) {y = x}
else if(x == 6) {y = x}
else if(x == 7) {y = x}
else if(x == 8) {y = x}
else if(x == 9) {y = x}
else if(x == 10) {y = x}
else if(x == 11) {y = x}
else if(x == 12) {y = x}
else if(x == 13) {y = x}
else if(x == 14) {y = x}
else if(x == 15) {y = x}
else if(x == 16) {y = x}
else if(x == 17) {y = x}
else if(x == 18) {y = x}
else if(x == 19) {y = x}
else if(x == 20) {y = x}

}

и

var x=20;
var y=0;

for (var i=0; i < 100000; i++) {

switch (x) {

case 0 : y=x;break;
case 1 : y=x;break;
case 2 : y=x;break;
case 3 : y=x;break;
case 4 : y=x;break;
case 5 : y=x;break;
case 6 : y=x;break;
case 7 : y=x;break;
case 8 : y=x;break;
case 9 : y=x;break;
case 10 : y=x;break;
case 11 : y=x;break;
case 12 : y=x;break;
case 13 : y=x;break;
case 14 : y=x;break;
case 15 : y=x;break;
case 16 : y=x;break;
case 17 : y=x;break;
case 18 : y=x;break;
case 19 : y=x;break;
case 20 : y=x;
}
}[/code]

FireFox: IFTE: 250ms, SWITCH: 25ms Прирост производительности: 10.00 раз
IE: IFTE: 281ms, SWITCH: 219ms Прирост производительности: 1.28 раза

этот же тест в PHP показал прирост производительности при использовании оператора switch в 1.46 раза

[p]2. Switch Structure[/p]

Оператор switch быстрее выполняется, если переменные (по которым ведется сравнение значения) упорядочены и увеличиваются предсказуемо.

[code]
iter2 = 100000;
var x=20;
var y=0;

for (var i=0; i < iter2; i++) {

switch (x) {

case 0 : y=x;
case 1 : y=x;
case 2 : y=x;
case 3 : y=x;
case 4 : y=x;
case 5 : y=x;
case 6 : y=x;
case 7 : y=x;
case 8 : y=x;
case 9 : y=x;
case 10 : y=x;
case 11 : y=x;
case 12 : y=x;
case 13 : y=x;
case 14 : y=x;
case 15 : y=x;
case 16 : y=x;
case 17 : y=x;
case 18 : y=x;
case 19 : y=x;
case 20 : y=x;
}
}

и

iter2 = 100000;
var x=200;
var y=0;

for (var i=0; i < iter2; i++) {
switch (x) {

case 0 : y=x;
case 9 : y=x;
case 23 : y=x;
case 35 : y=x;
case 41 : y=x;
case 50 : y=x;
case 62 : y=x;
case 70 : y=x;
case 87 : y=x;
case 91 : y=x;
case 102 : y=x;
case 111 : y=x;
case 125 : y=x;
case 130 : y=x;
case 149 : y=x;
case 152 : y=x;
case 161 : y=x;
case 171 : y=x;
case 183 : y=x;
case 190 : y=x;
case 199 : y=x;
}
}[/code]

FireFox: SWITCH БЕЗ ОПТИМИЗАЦИЙ: 78ms, SWITCH С ОПТИМИЗАЦИЕЙ: 47ms Прирост производительности: 1.66 раза
IE: SWITCH БЕЗ ОПТИМИЗАЦИЙ: 218ms, SWITCH С ОПТИМИЗАЦИЕЙ: 218ms Прирост производительности: нет

в PHP это тоже не дает прироста к проиводительности.
в PHP switch отрабатывает быстрее, если переменная x не совпадает ни с одним из значений case...


[p]3. Look Up Tables[/p]
Смысл оптимизации заключается в том, чтобы минимизировать трудоемкие операции, например математические. Эта минимизация заключается в том чтобы все возможные результаты заранее поместить в массив и выбирать результаты минуя операции вычисления.

Например

[code]sin = new Array();

for (var i=1;i<=360;i++) {
sin[i]=i*(Math.PI/180);
}[/code]

для того чтобы выбрать синус необходимого угла например 34 градуса:

[code]var trigVal = sin[34];[/code]

Код используемый в тестах:

создаем массив-таблицу значений

logTable = new Array(100);

for (var i=0; i <=99; i++) {
logTable[i] = Math.log(i);
}

[p]4. Loop Unrolling[/p]

Идея заключается в ускорении выполнения циклов, наглядный пример:

[code]for (var i=0;i<iterations;) {
[делаем что-то с i];i++;
[делаем что-то с i];i++;
[делаем что-то с i];i++;
[делаем что-то с i];i++;
[делаем что-то с i];i++;
}[/code]

выполнится намного быстрее чем код

[code]for (var i=0; i<iterations; i++) {
[делаем что-то с i];
}[/code]

в PHP тоже очень хорошо видно увеличение производительности при использовании Loop Unrolling.

[p]5. Reverse Loop Counting[/p]
Дело в том, что сравнение переменной с числом выполняется быстрее, чем сравнение переменной с другой переменной. Также автор статьи упоминает, что сравнение переменной с числом 0 выполняется быстрее, чем сравнение переменной с каким-либо другим числом.

По этому цикл

[code]for (i=0; i<iterations; i++){
// do something here
}[/code]

будет лучше заменить на цикл

[code]for (var i=iterations;i>0;i--) {
// do something here
}[/code]


Тестировался код:

CODE 1:

[code]rIter=500000;
for (var i=rIter;i>0;i--){

}[/code]

CODE 2:

[code]rIter=500000;
for (var i=0;i<rIter;i++) {

}[/code]

FireFox: CODE 2: 219ms, CODE 1: 78ms Прирост производительности: 2.80 раза
IE: CODE 2: 188ms, CODE 1: 125ms Прирост производительности: 1.50 раза

Это справедливо и для PHP!!!

[p]6. Loop Flipping[/p]

Автор в статье говорит, что встречаются ситуации, когда постфиксный цикл будет работать быстрее, но конкретных примеров не приводит.
Этого следует избегать, так как постфиксный цикл

CODE1:

[code]var fIter=500000;
i=0;
do
{
i++;
} while(i<fIter);[/code]

выполняется медленнее чем префиксный (по крайней мере во всех проводимых javascript тестах)

CODE2:

[code]var fIter=500000;
for (var i=0;i<fIter;i++) {

}[/code]

FireFox: CODE1: 578ms, CODE2: 219ms Прирост производительности: 2.64 раза
IE: CODE1: 313ms, CODE2: 187ms Прирост производительности: 1.67 раза

в PHP ситуация обратная, постфиксный цикл (не знаю почему) немного быстрее работает.




Обсудить в ФОРУМе - комментариев ()


Путь: Статьи > Общие вопросы

Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Контакты Design by webFaction Ukrainian PHP Group 2004-2005