14.08.2014, 08:27
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Цитата:
|
но цикл всё равно быстрее.)
|
От VM зависит. В IE11 нет разницы как правило.
***
А по теме: Collection
Работает быстрее итераторов, циклов и всех известных библиотек и со всеми возможными типами данных
|
|
14.08.2014, 12:55
|
Лаборант :-)
|
|
Регистрация: 08.11.2011
Сообщений: 806
|
|
действительно
попробовал скорость filter и обычного цикла на большом массиве
в Хроме, FF, IE11
у меня цикл быстрее в разы (см. в console)
спасибо Aetae - не знал
var i,
maxItems = 1e6,
arr = [],
needKey = 500137, // где-то в середине
myArr;
// генерим массив
for (i = 0; i < maxItems; i += 1) {
arr.push({key: i, label: i + ''});
}
// test filter
console.time('filter');
myArr = arr.filter(function (item) {
return (item.key === needKey);
});
console.timeEnd('filter');
alert(JSON.stringify(myArr));
// test цикл
myArr = [];
console.time('for');
for (i = 0; i < arr.length; i += 1) {
if (arr[i].key === needKey) {
myArr.push(arr[i]);
break;
}
}
console.timeEnd('for');
alert(JSON.stringify(myArr));
|
|
14.08.2014, 13:00
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Pavel M. никогда не делай бенчмарки через консоль отладчика, т.к. он отключает использование JIT компилятора и результат замеров может значительно отличаться.
|
|
14.08.2014, 13:04
|
|
Профессор
|
|
Регистрация: 19.01.2010
Сообщений: 354
|
|
Сообщение от Pavel M.
|
действительно
попробовал скорость filter и обычного цикла на большом массиве
в Хроме, FF, IE11
у меня цикл быстрее в разы (см. в console)
спасибо Aetae - не знал
|
Потому что методика тестирования хромает. filter обходит весь массив, for — нет. Можно попробовать так:
var i,
maxItems = 1e6,
arr = [],
needKey = 500137, // где-то в середине
myArr;
// генерим массив
for (i = 0; i < maxItems; i += 1) {
arr.push({key: i, label: i + ''});
}
// test filter
console.time('some');
myArr = [];
arr.some(function (item) {
if (item.key === needKey) {
myArr = [item];
return true;
}
return false;
});
console.timeEnd('some');
alert(JSON.stringify(myArr));
// test цикл
myArr = [];
console.time('for');
for (i = 0; i < arr.length; i += 1) {
if (arr[i].key === needKey) {
myArr.push(arr[i]);
break;
}
}
console.timeEnd('for');
alert(JSON.stringify(myArr));
some у меня отрабатывает в полтора раза быстрее filter, но все еще в два раза медленнее, чем for:
Цитата:
|
some: 23.802ms VM1460:24
for: 14.023ms VM1460:41
|
|
|
14.08.2014, 13:07
|
|
Профессор
|
|
Регистрация: 19.01.2010
Сообщений: 354
|
|
Сообщение от kobezzza
|
Pavel M. никогда не делай бенчмарки через консоль отладчика, т.к. он отключает использование JIT компилятора и результат замеров может значительно отличаться.
|
Как насчет jsperf? Первое, что нагуглилось: http://jsperf.com/array-some-vs-loop
|
|
14.08.2014, 13:11
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
jsperf неплохой сервис, но многие не понимают, что примеры для теста он сам запускает в цикле, т.е. когда мы тестируем циклы и итераторы, то у нас на самом деле тестируется выполнение итераторов и циклов внутри цикла, а если более точно сказать - скорость инициализации + скорость выполнения и это может полностью исказить результат теста.
Для тестирования именно скорости итераций лучше самом написать простой тест, как например тут https://github.com/kobezzza/Collecti...ter/benchmarks
Цитата:
|
some у меня отрабатывает в полтора раза быстрее filter, но все еще в два раза медленнее, чем for:
|
Я хоть убей не понимаю, зачем костылить в своём коде и делать оптимизации, которые "завтра" с обновлением VM могут стать абсолютно бесполезными (я уже молчу про части, где часть на циклах, а часть итераторах), но при этом делают наш код ужасным. Есть же готовые либы, которые инкапсулируют в себе все все оптимизации и работают супер быстро, но при этом дают простой и удобный интерфейс, и не нужно самому ничего изобретать.
Я уже молчу про то, что нативные интерфейсы алгоритмически убоги и работают только с массивами. Очень частый пример, нужно сделать фильтр, потом мап, а потом взять первые 10 результатов, т.е.
filter().map().slice()
Алгоритмическая сложность просто ужасна, думаю всем это понятно. Гораздо лучше сделать:
map(..., {filter(), slice()})
Т.е. всё в один проход вместо 3-х
Последний раз редактировалось kobezzza, 14.08.2014 в 13:19.
|
|
14.08.2014, 13:26
|
|
Профессор
|
|
Регистрация: 19.01.2010
Сообщений: 354
|
|
Сообщение от kobezzza
|
Я хоть убей не понимаю, зачем костылить в своём коде и делать оптимизации, которые "завтра" с обновлением VM могут стать абсолютно бесполезными (я уже молчу про части, где часть на циклах, а часть итераторах), но при этом делают наш код ужасным.
|
Ну, лично мне вообще все равно, это просто спортивный вопрос: правда ли, что Array extras (или как там правильно) быстрее, чем простой for?
Сообщение от kobezzza
|
Гораздо лучше сделать:
map(..., {filter(), slice()})
Т.е. всё в один проход вместо 3-х
|
Это какая-то новая экма? Потому что я в ней ни в зуб ногой. Что эта запись означает?
|
|
14.08.2014, 13:36
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Цитата:
|
Это какая-то новая экма? Потому что я в ней ни в зуб ногой. Что эта запись означает?
|
Это псведокод
С использованием либы Collection это будет выглядеть так:
$C(/* тут наш объект для итераций */).map(function () {
...
}, {
filter: function () {
...
},
from: 100,
count: 10
});
Цитата:
|
Ну, лично мне вообще все равно, это просто спортивный вопрос: правда ли, что Array extras (или как там правильно) быстрее, чем простой for?
|
Это слишком сложный вопрос, т.к. он привязан к примеру и мощности JIT VM, т.е. однозначного ответа нет.
|
|
14.08.2014, 13:55
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Цитата:
|
kobezzza,
Я бы использовал либу для итераций еслибы было какое-то проседание в скорости работы кода. Мне это не требуется, у меня нет огромных объемов данных и необходимости быстро их итерировать.
|
Ну у меня просто другой подход. Я всегда юзаю либу и просто не думаю о количестве и типе данных, т.к. оно всегда будет работать быстро
Последний раз редактировалось kobezzza, 14.08.2014 в 14:00.
|
|
14.08.2014, 14:06
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
kobezzza,
Ну это потому что ты написал эту либу)))
Я тоже таскаю некоторые свои штуки из проекта в проект)
А подключать либу на 17кб просто чтобы не париться - неохота)
Я и так не парюсь)
|
|
|
|