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