Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.10.2012, 16:35
Интересующийся
Отправить личное сообщение для Arconas Посмотреть профиль Найти все сообщения от Arconas
 
Регистрация: 21.05.2010
Сообщений: 11

Быстродействие циклов. Вопросы.
Добрый день.
Не так давно наткнулся на http://www.jstoolbox.com/2008/03/25/...zaciya-ciklov/, посвященную оптимизации циклов в JS. Стало интересно проверить на деле какой же из циклов реально быстрее.

В результате был написан такой код http://pastebin.com/9tfJVzbE, в котором Я использовал разную запись циклов (полная против краткой) и разный обход массива (i++ или i--). В первом варианте скрипта (http://pastebin.com/7iW79Za7) массив задавался в каждой функции. Сейчас Я его вынес в глобальную область и дал обычный вывод данных на страницу вместо консоли.

И вот какие результаты Я получил:
Полная запись с len - это for(var i= 0, len = tArray.length; i<len; i++)
FF 16
Код:
for полная запись. Перебор по возрастающей 36 ms
for полная запись с len. Перебор по возрастающей 32 ms
for полная запись. Перебор по убывающей 39 ms
for краткая запись. Перебор по убывающей 38 ms
while. Перебор по возрастающей 46 ms
while. Перебор по убывающей 42 ms
do. Перебор по убывающей 43 ms


Chrome 22
Код:
for полная запись. Перебор по возрастающей 31 ms
for полная запись с len. Перебор по возрастающей 33 ms 
for полная запись. Перебор по убывающей 34 ms
for краткая запись. Перебор по убывающей 35 ms
while. Перебор по возрастающей 45 ms
while. Перебор по убывающей 41 ms
do. Перебор по убывающей 40 ms
IE 9
Код:
for полная запись. Перебор по возрастающей 113 ms
for полная запись с len. Перебор по возрастающей 83 ms 
for полная запись. Перебор по убывающей 76 ms
for краткая запись. Перебор по убывающей 73 ms
while. Перебор по возрастающей 87 ms
while. Перебор по убывающей 66 ms
do. Перебор по убывающей 79 ms
И вот тут возникли вопросы:
  1. Почему краткая запись, которая вроде бы должна быть быстрой, не такая быстрая? Или в статье всё врут? Она довольно старая.
  2. Не закралась ли в код ошибка и правильно ли Я понял краткую запись?
  3. Почему запись с вычислением длинны массива в условии срабатывает быстрее обычной?
И, что самое интересное, в первом варианте, где массив задавался в каждой функции перебор i-- проходил быстрее, чем по i++.
В JS новичок =(

Последний раз редактировалось Arconas, 17.10.2012 в 16:37.
Ответить с цитированием
  #2 (permalink)  
Старый 17.10.2012, 17:47
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

оптимизировать циклы вообще нет смысла. пишите так, как хочется.

оптимизировать нужно в первую очередь алгоритм.

прирост проиводительности из-за замены формы циклы почти не заметен. хотя ... "копейка рубль бережёт".


Сообщение от Arconas
Почему краткая запись, которая вроде бы должна быть быстрой, не такая быстрая?
краткость != скорость.
Сообщение от Arconas
Почему запись с вычислением длинны массива в условии срабатывает быстрее обычной?
оптимизации на уровне движка.

мерять лучше на jsperf.com ... там есть уже с десяток, наверное - если на с сотню - подобных тестов на скорость циклов.

Последний раз редактировалось melky, 17.10.2012 в 17:57.
Ответить с цитированием
  #3 (permalink)  
Старый 17.10.2012, 18:13
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от melky
прирост проиводительности из-за замены формы циклы почти не заметен. хотя ... "копейка рубль бережёт".
Вообще нет смысла этим заниматься. В разных браузерах разные циклы исполняются по-разному. Все продвинутые движки оптимизируют циклы, так что нет смысла писать их как-то извращённо - предсказать, в каком конкретном случае скорость возрастёт, нереально)
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #4 (permalink)  
Старый 17.10.2012, 21:03
Интересующийся
Отправить личное сообщение для Arconas Посмотреть профиль Найти все сообщения от Arconas
 
Регистрация: 21.05.2010
Сообщений: 11

Сообщение от melky Посмотреть сообщение
оптимизировать циклы вообще нет смысла. пишите так, как хочется.
оптимизировать нужно в первую очередь алгоритм.
На самом деле вопросы носили чисто учебный характер, так как разница в циклах практически не заметна в обычных условиях, но, как Вы правильно подметили, копейка рубль бережет. Опять же из теста видно, что запись с объявлением границы цикла в некоторых браузерах работает быстрее.

А желание проверить скорость работы циклов вылилось, собственно, из задачи по перестановке элементов массива в обратном порядке. Там Я сравнивал метод с переменной, с дополнительным массивом и array.reverse(); Reverse, кстати оказался самым медленным во всех браузерах кроме IE. Оптимизация и производительность носили учебный характер. В настоящем приложении данных немного, чтобы их количество как-то повлияло на скорость.
Сообщение от melky Посмотреть сообщение
краткость != скорость.
Это тоже понятно. Не раз и не два, и даже не три натыкался на статьи по оптимизации скриптов и там почти всегда присутствовал совет убрать из цикла якобы не нужные условия. Любопытство снова взяло верх и Я решил попробовать сравнить. Результаты оказались не такими как Я ожидал и написал в личку Илье с вопросом почему так и где Я ошибся. Илья посоветовал перенести обсуждение на форум

Сообщение от melky Посмотреть сообщение
мерять лучше на jsperf.com ...
Чем он лучше, если там тот же самый код?

Цитата:
что нет смысла писать их как-то извращённо - предсказать, в каком конкретном случае скорость возрастёт, нереально)
Согласен. Так же нет смысла доверять советам из статей по оптимизации касательно циклов и длины имени переменной =) Но когда нечем заняться, а программировать хочется - пишу тесты из любопытства. Знаю, что глупо.

В общем... особенности движков. Никакой мистики.
Всем спасибо за ответы, темку можно удалять. Приношу извинения за беспокойство.
Ответить с цитированием
  #5 (permalink)  
Старый 17.10.2012, 21:58
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Arconas
На самом деле вопросы носили чисто учебный характер, так как разница в циклах практически не заметна в обычных условиях, но, как Вы правильно подметили, копейка рубль бережет. Опять же из теста видно, что запись с объявлением границы цикла в некоторых браузерах работает быстрее.
V8, как выяснилось (ссыль на хабр ниже), оптимизирует ещё и байткод, который получается на выходе компилятора - поэтому самый что ни на есть длинный и привычный цикл становится самым быстрым.

Я не разбирался, поэтому точный ответ с расследованием и прикреплением исходников V8 дать не могу.

Хотя, Клиффорд, похоже, занимался этим ... гм, "ЭТИМ".

http://habrahabr.ru/post/154537/

Я, конечно, люблю полазить в дебрях V8 и двига FireFox (забыл, как его ...), но только в экстренных и неразрешимых случаях.
Сообщение от Arconas
Чем он лучше, если там тот же самый код?
Верно, одно и то же ... но там красивее и нагляднее

Сообщение от Arconas
В общем... особенности движков. Никакой мистики.
В этом же и мистика
Ответить с цитированием
  #6 (permalink)  
Старый 17.10.2012, 22:53
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

melky,
SpiderMonkey.

Arconas,
у вас там замыкания спрошь и рядом, конечно будут результаты разные, тут уже нужно смотреть на то, как движки оптимизируют lookup и всё такое. сделайте всё отдельно и в одной функции на каждый тест, тогда можно говорить о результатах. И да, jsperf лучше, просто потому, что лучше. Там проверяется не только врея, но и другие нюансы, в которые я даже не углублялся, но можно почитать документацию.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #7 (permalink)  
Старый 17.10.2012, 22:55
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Незаметил первый вариант:
Цитата:
В первом варианте скрипта (http://pastebin.com/7iW79Za7) массив задавался в каждой функции. Сейчас Я его вынес в глобальную область и дал обычный вывод данных на страницу вместо консоли.
В нём лучше сделанно.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #8 (permalink)  
Старый 17.10.2012, 23:15
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Nekromancer
melky,
SpiderMonkey.
я его всё время путаю с SunSpider из-за похожести имён.
Ответить с цитированием
  #9 (permalink)  
Старый 17.10.2012, 23:26
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от melky
я его всё время путаю с SunSpider из-за похожести имён.
Ничего, скоро у лисы будет новый двиг, который называется по-другому... Вот только я забыл, как)
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #10 (permalink)  
Старый 18.10.2012, 00:39
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

trikadin,
Это от куда такая инфа то? Основной вроде SpiderMonkey. А IonMonkey и JugerMonkey это просто надможества, грубо говоря.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разные вопросы по элементам интерфейса от wmag -_- wmag Элементы интерфейса 12 16.08.2012 11:06
Не работает код внутри циклов DZHETIGAPA Events/DOM/Window 1 21.06.2011 01:03
Форум: помечать "закрытые" вопросы. Jurasmi Сайт Javascript.ru 27 11.12.2010 19:53
вопросы по jQuery micscr jQuery 12 23.12.2009 16:36
AJAX для ЧАЙНИКОВ (вопросы) sc2r2bey AJAX и COMET 16 10.07.2009 21:23