Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Производительность условий if-else. (https://javascript.ru/forum/misc/40668-proizvoditelnost-uslovijj-if-else.html)

kolyas 15.08.2013 01:53

Производительность условий if-else.
 
Очередная попытка отжать пару секунд процессора.

Есть три варианта исполльзования условий.


// --------- 1 -------------------------------------
if ((a == 1) && (b == 2) && (a1 == 1) && (b1 == 2)) {
  c = 1;
}

// --------- 2 -------------------------------------
if ((a == 1) && (b = 2)) {
  if ((a1 = 1) && (b1 == 2)) {
    c = 1;
 }
}

// --------- 3 -------------------------------------
if (a == 1) {
  if (b == 2) {
    if (a1 == 1) {
      if (b1 == 2) {
        c = 1;
      }
    }
  }
}


Я опробовал эти варианты тут http://jsperf.com/double-if/2
Показало что третий вариант лучше всего.

Кто что скажет: лучше делать цепочку вложенных if или все таки не париться и делать объединенные(как в случае 1) условия для "красоты" кода ?

mta88 15.08.2013 07:01

микрооптимизации до психушки доведут
тем более с современными jit-компиляторами, которые делают что хотят

я заменил == на === и разница между результатами уменьшилась

kolyas 15.08.2013 19:34

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 267651)
kolyas,
Пардон, а вы что, собираетесь в реальных условиях эти if'ы по 300 млн. раз в секунду гонять? )

Вот уж смешно устраивать тесты на таких крошечных кусочках кода. Контекст, из которого это выдрано, наверняка гораздо тяжелее, и все отличия просто растворятся на его фоне...

Не 300млн раз, но используется в цикле ~15*81*24 раз.
Ковыряю одну текстовую онлайн игру, и приспосабливаю ее под себя.

И да там довольно много условий, регулярок и условий с indexOf и куча многомерных массивов. Поэтому постепенно изучая JS, упрощаю код и облегчаю его выполнение.

if (TypeSearch !== 'all'){
				if (!istut(txt1, TypeSearch)){
					continue;
				}
			} else{
				if ((istut(txt1, "str1")) || (istut(txt1, "str2")) || (istut(txt1, "str3"))){
					continue;
				}
			}

И таких кусочков пока хватает.

kolyas 15.08.2013 21:11

К сожалению там много завязано на окружаюшие элементы - получаемые данные ajax и тд. Я думал что если:

if (a == 1) if (b==1)быстрее чем if ((a==1)&& (b==1)),


то и:
if (a.indexOf(b)!==1) if (b.indexOf(c)!==1)
будет быстрее чем:

if ((a.indexOf(b)!==-1) && (b.indexOf(c)!==-1) )


А насколько быстрее в реальных условиях, это уже дело десятое. Все равно каждый раз не будет равным.

kolyas 15.08.2013 22:21

НЕ прошло. Я отказался от тестов простых кусков, добавил timeStart и timeEnd в начало и конец общего скрипта, ну и крупных функций. И в конце работы вывожу время, теперь ориентируюсь чисто на это. Другие тесты забросил.

Makarov 15.08.2013 22:50

И еще раз повторю что написано выше и добавлю своего:
1) Микрооптимизации, которые можно сделать в своем коде, в большинстве случаев уступают оптимизациям которые может сделать компилятор/интерпретатор.
2) Для скриптов оптимизации такого рода почти наверняка убьются об реализацию js в браузере =(. То есть для одних браузеров оптимизация будет работать, для других нет, для третьих работать в зависимости от притяжения юпитера
3). Как следствие первых двух пунктов, оптимизировать стоит алгоритмы. Использовать алгоритмы с минимальной вычислительной сложностью, синхронные вызовы асинхронными заменить etc. Голову правда поломать придется, но выигрыш это может дать вполне реальный

kolyas 16.08.2013 12:49

Переделал немного алгоритм работы. Упростил часть условий. Общее время работы скрипта стало стабильно на 25-30 сек быстрее ( было 6 минут). Негусто, но будем копать дальше.

maxmaster 17.08.2013 13:06

:blink: Вы на каком железе это проверяете? И у вас весь код выполняется целиком?

Deff 17.08.2013 20:15

kolyas,
:) Проще сделать так
var statysWord= [a,b,a1,b1].join('');
if(statysWord=='1212') c=1;

B@rmaley.e><e 17.08.2013 20:34

Цитата:

Сообщение от kolyas
15*81*24 раз.

30 000 итераций? Смешно, да.
Профайлер-то запускали?

kolyas 30.08.2013 06:17

Цитата:

Сообщение от maxmaster (Сообщение 267931)
:blink: Вы на каком железе это проверяете? И у вас весь код выполняется целиком?

Железо обычное E8400 3Ггц 8 Гб Озу. Да кода за раз выполняется много.

Цитата:

Сообщение от Deff (Сообщение 267966)
kolyas,
:) Проще сделать так
var statysWord= [a,b,a1,b1].join('');
if(statysWord=='1212') c=1;

Ну эти условия были как образец, в реалиях конечно все сложнее.

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 267970)
30 000 итераций? Смешно, да.
Профайлер-то запускали?

А что именно смешного. 30k ajax получения данных это много или мало? Да запускал профайлер.


Часовой пояс GMT +3, время: 21:26.