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

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 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 ситуація зворотна, постфіксний цикл (не знаюпочему) трохи швидше працює.

 
Що таке сесії і для чого вони потрібні?
26.04.2007
Сесії - це механізм, створений для тимчасового зберігання і передачі інформації між скриптами в межах одного сайту ...
Як надіслати пошту
29.05.2007
Якщо Вам потрібно надіслати повідомлення адміністратору, користувачеві, зробити розсилку, відправити звіт електронною поштою, то простіше за все це зробити за допомогою вбудованої функції mail ()...
Блокування файлів
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!"

 

Rambler's Top100