Быстродействие циклов. Вопросы.
Добрый день.
Не так давно наткнулся на 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 Chrome 22 Код:
for полная запись. Перебор по возрастающей 31 ms Код:
for полная запись. Перебор по возрастающей 113 ms
В JS новичок =( |
оптимизировать циклы вообще нет смысла. пишите так, как хочется.
оптимизировать нужно в первую очередь алгоритм. прирост проиводительности из-за замены формы циклы почти не заметен. хотя ... "копейка рубль бережёт". Цитата:
Цитата:
мерять лучше на jsperf.com ... там есть уже с десяток, наверное - если на с сотню - подобных тестов на скорость циклов. |
Цитата:
|
Цитата:
А желание проверить скорость работы циклов вылилось, собственно, из задачи по перестановке элементов массива в обратном порядке. Там Я сравнивал метод с переменной, с дополнительным массивом и array.reverse(); Reverse, кстати оказался самым медленным во всех браузерах кроме IE. Оптимизация и производительность носили учебный характер. В настоящем приложении данных немного, чтобы их количество как-то повлияло на скорость. Цитата:
Цитата:
Цитата:
В общем... особенности движков. Никакой мистики. Всем спасибо за ответы, темку можно удалять. Приношу извинения за беспокойство. |
Цитата:
Я не разбирался, поэтому точный ответ с расследованием и прикреплением исходников V8 дать не могу. Хотя, Клиффорд, похоже, занимался этим ... гм, "ЭТИМ". http://habrahabr.ru/post/154537/ Я, конечно, люблю полазить в дебрях V8 и двига FireFox (забыл, как его ...), но только в экстренных и неразрешимых случаях. Цитата:
Цитата:
|
melky,
SpiderMonkey. Arconas, у вас там замыкания спрошь и рядом, конечно будут результаты разные, тут уже нужно смотреть на то, как движки оптимизируют lookup и всё такое. сделайте всё отдельно и в одной функции на каждый тест, тогда можно говорить о результатах. И да, jsperf лучше, просто потому, что лучше. Там проверяется не только врея, но и другие нюансы, в которые я даже не углублялся, но можно почитать документацию. |
Незаметил первый вариант:
Цитата:
|
Цитата:
|
Цитата:
|
trikadin,
Это от куда такая инфа то? Основной вроде SpiderMonkey. А IonMonkey и JugerMonkey это просто надможества, грубо говоря. |
Цитата:
|
Ну и для полного уточнения, SpiderMonkey это VM, а JagerMonkey и IonMonkey это JIT компиляторы. Здесь вот есть отличный тест, что бы увидеть разницу. Запускать соответсвенно в текущем Fx и Nightly, даже лучше Aurora, так уже новый компилятор, но Аврора быстрее Ночной из-за специальной сборки Ночной для разработки. http://jsperf.com/array-create-slice-call-vs-for/4
|
Цитата:
Цитата:
function bench(){ var start,stop, result; start = new Date(); for(var i=0; i<1000000; i++){ tArray[i]; } stop = new Date(); result = stop - start; log.innerHTML = 'for полная запись. Перебор по возрастающей ' + result + ' ms'+'<br/>'; start = new Date(); for(var i=1000000; i>=0; i--){ tArray[i]; } stop = new Date(); result = stop - start; log.innerHTML += 'for полная запись. Перебор по убывающей ' + result + ' ms'+'<br/>'; //и так далее? } Результаты те же самые с поправкой на цифры. То есть, грубо говоря 1кк раз обошли массив по циклу for(var i=0; i<1kk; i++) и получили 3 ms при проходе i++ и от 0 до 2 ms при проходе i--. Цитата:
На самом деле jsperf, конечно, лучше. У них своя, как Я понял, библиотека в которой учтены многие факторы за которые меня сейчас пинают. Но только вот документации там не нашел. Только faq. Будет время обязательно опробую jsPerf и проведу тесты там. |
Цитата:
|
Цитата:
на линукс пришел FF 16 ... сейчас буду тестить :) |
Часовой пояс GMT +3, время: 20:56. |