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

 
Постранічний висновок результату
29.05.2007
Як надіслати пошту
29.05.2007
Блокування файлів
29.05.2007