ru en uk

  авторизация

(044) 362 48 16   (098) 294 41 60


   Цены

1. Switch vs If-Then-Else



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


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;
}
}


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

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

2. Switch Structure



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


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;
}
}


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

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


3. Look Up Tables


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

Например

sin = new Array();

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


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

var trigVal = sin[34];


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

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

logTable = new Array(100);

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

4. Loop Unrolling



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

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


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

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


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

5. Reverse Loop Counting


Дело в том, что сравнение переменной с числом выполняется быстрее, чем сравнение переменной с другой переменной. Также автор статьи упоминает, что сравнение переменной с числом 0 выполняется быстрее, чем сравнение переменной с каким-либо другим числом.

По этому цикл

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


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

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



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

CODE 1:

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

}


CODE 2:

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

}


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

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

6. Loop Flipping



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

CODE1:

var fIter=500000;
i=0;
do
{
i++;
} while(i<fIter);


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

CODE2:

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

}


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

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

 
Блокировка файлов
29.05.2007
"Warning! On most operation systems flock() is implemented at the process level. When using a multithreaded server API like ISAPI you cannot rely on flock() to protect files against other PHP scripts running in parallel threads of the same server instance!"
Как отослать почту
29.05.2007
Если Вам нужно послать сообщение администратору, пользователю, сделать рассылку, отправить отчет по електронной почте, то проще всего это сделать с помощью встроенной функции mail()...
Введение в PHP5
29.05.2007
PHP5 ещё официально не вышел, но "рабочие" версии уже трудоспособны (равно как и нестабильны!), так что мы вполне можем начать изучение новых возможностей грядущего релиза PHP и попрактиковать с ними. В этой статье мы поговорим о трёх основных нововведениях в PHP5

 

Rambler's Top100