Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   while vs for (https://javascript.ru/forum/misc/48809-while-vs.html)

newobject 17.07.2014 18:43

while vs for
 
сделал прогонку 1000000 раз.

test=function(fu, i, name){
console.time(name)
while(--i){fu()}
console.timeEnd(name)
}

arr="foo bar baz flk jdjdj dkkdke jdj".split(" ")
	 
	tst1=function(){
	for(var i=0; i<arr.length; i++){arr[i]}
	}
	 
	tst1_a=function(){
	for(var i=arr.length; i>-1; i--){arr[i]}
	}
	 
	tst2=function(){
	var i = arr.length
	while(i--){arr[i]}
	}
dflt=1000000
test(tst1, dflt, "ts1")
test(tst1_a, dflt, "ts1_a")
test(tst2, dflt, "ts2")

//ts1: 23ms
//ts1_a: 263ms
//ts2: 41ms


Как видно, while сливает в 2 раза почти, но 2-й for просто фантастически медленный. Интересно, почему? Тестировал на ноде.

bes 17.07.2014 19:05

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

newobject 17.07.2014 19:24

bes,
Отформатировал. Только не пойму, зачем это. Что там буков чтоли не видно?

Что по сабжу?

bes 17.07.2014 19:28

добавь кнопку запуска [js run] и сам тест, чтобы сразу просмотреть результат,
по твоему примеру не видно, что ты
Цитата:

Сообщение от newobject
сделал прогонку 1000000 раз.


newobject 17.07.2014 19:29

Цитата:

Сообщение от bes
не видно

Ты что не веришь чтоли?

bes 17.07.2014 19:33

Цитата:

Сообщение от newobject
Ты что не веришь чтоли?

здесь нерелигиозное учреждение ;)

newobject 17.07.2014 19:38

bes,
У меня не работает запуск. Как эту кнопку правильно добавить? просто дописать в откр тег или еще что-то?

bes 17.07.2014 19:40

Цитата:

Сообщение от newobject
bes,
У меня не работает запуск. Как эту кнопку правильно добавить? просто дописать в откр тег или еще что-то?

с чего ты взял, что не работает?

newobject 17.07.2014 19:46

Цитата:

Сообщение от bes
с чего ты взял, что не работает?

Все понял. Я думал, консоль сама откроется. Неудобно сделано.

newobject 17.07.2014 19:49

109/62/79 в лисе показало. Странно. То есть, в лисе обычный цикл медленней.

newobject 17.07.2014 19:52

В хроме
ts1: 23.000ms
ts1_a: 359.000ms
ts2: 43.000ms

Сопоставимо с нодой, что не удивительно, с-на.

Erolast 17.07.2014 19:53

Объявление в глобале без var... Отсутствие точки с запятой... Отсутствие отбивки операторов... Ужасное форматирование вцелом... Кого-то ты мне напоминаешь.

newobject 17.07.2014 20:20

Erolast,
Забей на форматирование, будь мужиком.

MallSerg 17.07.2014 20:25

Степень идиотизма == foo

bes 17.07.2014 20:48

newobject, проверь количество итераций в циклах

Sweet 17.07.2014 20:51

Вообще:
foo = new Object
Просто он на форматирование забил:)

newobject 17.07.2014 20:58

bes,
там, по моему, во 2-й на одну больше. Это роли особо не играет.

рони 17.07.2014 21:49

:write:
дела давно минувших дней ...

http://javascript.ru/forum/events/16...html#post98821

http://javascript.ru/forum/misc/8935...niya-koda.html

http://javascript.ru/forum/misc/1042...ay-length.html

newobject 17.07.2014 22:24

рони,
Ваша вторая ссылка: Вы дали на конкретное сообщение, а не на тему; если Вы не ошиблись, я позволю себе заметить, что рассуждения, приведенные там, по-поводу while vs do while ИМХО, наивны. Разница там будет всего в одной итерации,которая исполнится до проверки, это существенно на скорость повлиять не может. Это только в частном случае, поскольку у него там break, есть разница, в целом же, при обычном использовании, это не фактор.

bes 17.07.2014 22:42

Цитата:

Сообщение от newobject
bes,
там, по моему, во 2-й на одну больше. Это роли особо не играет.

итого: время исполнения одной итерации * 1000000

newobject 17.07.2014 22:52

Цитата:

Сообщение от bes
время исполнения

Не время а количество.

newobject 17.07.2014 23:00

bes,
Убрал я одну итерацию, протестил, изменений нет, практически.

bes 17.07.2014 23:11

Цитата:

Сообщение от newobject
Не время а количество.

ты о чём

Цитата:

Сообщение от newobject
bes,
Убрал я одну итерацию, протестил, изменений нет, практически.

тест

test = function (fu, i, name) {
	console.time(name)
	while (--i) {
		fu()
	}
	console.timeEnd(name)
}

arr = "foo bar baz flk jdjdj dkkdke jdj".split(" ")

tst1 = function () {
	for (var i = arr.length; i > -1; i--) {
		arr[i]
	}
}
tst2 = function () {
	for (var i = arr.length; i > 0; i--) {
		arr[i]
	}
}


dflt = 1000000
test(tst1, dflt, "ts1")
test(tst2, dflt, "ts2")


хром
ts1: 151.000ms
ts2: 78.000ms

ff
ts1: таймер запущен
ts1: 14.78мс
ts2: таймер запущен
ts2: 7.06мс

newobject 17.07.2014 23:35

bes,
У меня ваш тест показывает приблизительно одинаковое время в обеих браузерах. Протестируйте несколько раз, у вас там что-то не так, возможно побочки были. Разница в пределах 5%.

bes 17.07.2014 23:43

Цитата:

Сообщение от newobject
bes,
У меня ваш тест показывает приблизительно одинаковое время в обеих браузерах. Протестируйте несколько раз, у вас там что-то не так, возможно побочки были. Разница в пределах 5%.

цифры каждый раз разные, от близких до в ~2 раза больших, предполагаю дело в jit-оптимизациях

рони 17.07.2014 23:51

newobject,
ок ссылки возможно по теме а может нет )))https://blogs.oracle.com/greimer/ent..._way_to_code_a

BETEPAH 18.07.2014 00:18

newobject,
для таких тестов есть сервис
http://jsperf.com/loop-vs-indexof/2

newobject 18.07.2014 00:30

BETEPAH,
Спасибо.

рони 18.07.2014 00:41

BETEPAH,
для полного счастья хотелось бы array[i] === 80000 50000 :thanks: или уж random

BETEPAH 18.07.2014 15:29

рони,
Я этот тест делал полтора года назад :)
Там внизу есть кнопка, позволяющая создавать свои ревизии, со своими условиями и прочим.
Удобство этого сервиса в том, что можно просто раздать ссылку и наглядно смотреть результаты как своего теста, так и тестов тех, кому дали ссылку без необходимости публиковать эти результаты на форуме.

рони 18.07.2014 15:42

BETEPAH,
50000 это середина а если искать с конца массива то естественно 80000 найдётся раньше чем при поиске с начала
loop (forward) -- заведомо в проигрыше в 4 раза

BETEPAH 18.07.2014 17:29

рони,
а-а... вон ты о чем. Ну, да, ну, да.


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