Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   DOM vs. innerHTML (https://javascript.ru/forum/misc/45034-dom-vs-innerhtml.html)

Riim 13.02.2014 07:41

Цитата:

Сообщение от melky
разве функция внутри forEach инлайнится движком?

да хз что там с ней делается. Сейчас перепроверил, разница в скорости в 3 раза.

danik.js 13.02.2014 08:57

Riim, хз как ты тестишь. Вот тут у меня в хроме forEach в 10 раз медленней for:
http://jsperf.com/for-vs-foreach/132

Riim 13.02.2014 10:44

Цитата:

Сообщение от danik.js
хз как ты тестишь

просто запускаю в консоли:
var i = 500000, arr = []; while (i--) { arr.push(i); }

var sum = 0, st = Date.now();
arr.forEach(function(num) { sum += num; });
console.log(Date.now() - st);

sum = 0; st = Date.now();
function add(num) { sum += num; }
arr.forEach(add);
console.log(Date.now() - st);

sum = 0; st = Date.now();
for (var j = 0, l = arr.length; j < l; j++) { sum += arr[j]; }
console.log(Date.now() - st);

sum = 0; st = Date.now();
for (var j = 0; j < arr.length; j++) { sum += arr[j]; }
console.log(Date.now() - st);

результат в хроме:
736
85
2496
2608

в ff:
657
590
871
913

пробовал переставлять тесты местами, пробовал отдельно генерить массив и далее отдельно запускать каждый тест. Проверь, мож я где затупил жестко. jsperf выдает результат схожий с твоим, странно как-то.

Riim 13.02.2014 10:55

ну вот, если запускать не из консоли, результат меняется, обидно :( , кажись придется иногда обычные циклы писать.

danik.js 13.02.2014 11:31

Цитата:

Сообщение от Riim
ну вот, если запускать не из консоли, результат меняется

Я тож такое заметил. Не знаю почему так. Для консоли нужно код оборачивать в анонимную функцию.

kobezzza 13.02.2014 12:33

Цитата:

Сообщение от danik.js (Сообщение 297425)
Я тож такое заметил. Не знаю почему так. Для консоли нужно код оборачивать в анонимную функцию.

При включённом отладчике отключается/частично отключается JIT компилятор

kobezzza 13.02.2014 12:34

Цитата:

Сообщение от Riim (Сообщение 297424)
ну вот, если запускать не из консоли, результат меняется, обидно :( , кажись придется иногда обычные циклы писать.

https://github.com/kobezzza/Collection
Кошерный функциональный стиль со скоростью циклов + прозрачная работа с LocalStorage/IndexedDB

Сравнения: https://github.com/kobezzza/Collecti...aster/profiler

kobezzza 13.02.2014 12:36

Цитата:

Сообщение от melky (Сообщение 297347)
разве функция внутри forEach инлайнится движком?

Зависит от функции.

рони 13.02.2014 13:34

kobezzza,
то что вы пишите я совсем непонимаю 98%, надеюсь на озарение ))), но немогли бы вы обьяснить, если можно что значит это:
Цитата:

Сообщение от kobezzza


kobezzza 13.02.2014 14:39

Цитата:

Сообщение от рони (Сообщение 297435)
kobezzza,
то что вы пишите я совсем непонимаю 98%, надеюсь на озарение ))), но немогли бы вы обьяснить, если можно что значит это:

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

Чтобы запустить нужно склонить к себе репозитарий:

git clone git://github.com/kobezzza/Collection.git


А затем запускать .html файлики, например: forEach.html

***

Сама Collection - это микролиба которая предоставляет унивесальный итераторный API для любых типов данных и работает как правило значительно быстрее нативных методов, т.к. основана на кодогенерации циклов в real-time с кучей оптимизаций.

http://javascript.ru/forum/project/4...tml#post295370

Пример: сравнение forEach в хроме (время в мс):

*** Циклы

for (i = 0; i < length; i++) 99
for (i = length; i--; ) 78
for (i = 0; i < length; i++) с функцией 81
for (i = 0; i < length; i++) с функцией в Function 86
for (i = -1; (i += 1) < length; ) 83

*** Итераторы

Array.prototype.forEach 348
jQuery.each 487
Underscore.each 345

*** Collection

$C().forEach 131


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