Ответ 1
Последний (для цикла) намного быстрее. Я помню, где-то был где-то ориентир, но я не могу найти ссылку.
Если производительность действительно проблема, я бы использовал цикл for. Это не очень затмевает код.
Я реализую некоторый код, который естественным образом подходит для карты. Тем не менее, у меня есть значительное количество объектов в списке, который я собираюсь перебирать, поэтому мой вопрос заключается в том, что это лучший способ сделать это:
var stuff = $.map(listOfMyObjects, someFunction())
var stuff = listOfMyObjects.map(someFunction())
или просто
var stuff = new Array();
for(var i = 0; i < listOfmyObjects.length; i++){
stuff.push(someFunction(listOfMyObjects[i]));
}
Последний (для цикла) намного быстрее. Я помню, где-то был где-то ориентир, но я не могу найти ссылку.
Если производительность действительно проблема, я бы использовал цикл for. Это не очень затмевает код.
вот тестовый пример, выполненный в jsben.ch: http://jsben.ch/#/BQhED
это показывает, что карта for-loop быстрее, чем карта jquery (по крайней мере, в хроме).
Во-первых, true Objects
не имеет встроенного метода .map()
, а не свойства .length
. Поэтому мы говорим о Arrays
или Array-like-objects
(например, объекты jQuery).
Однако не существует более быстрого способа повторения, чем использование встроенного цикла for
, while
или do-while
. Все другие функциональные операции выполняют (угадайте, какая) функция для каждой итерации, которая стоит.
jQuerys .each()
будет просто выполнять цикл for-in
, когда объект передается ему. Это довольно быстрый способ перебора объекта. Вы можете просто использовать for-in
самостоятельно и сохранить служебный вызов.
Другим "хорошим" способом с точки зрения удобочитаемости является использование функций ES5, таких как .keys()
и .map()
. Например:
var myObj = {
foo: 'bar',
base: 'ball',
answer: 42,
illuminati: 23
};
Object.keys( myObj ).map(function( prop ) {
console.log( myObj[ prop ] );
});
Я думаю, что это очень хорошая сделка с точки зрения читаемости, удобства и производительности. Конечно, вы должны использовать библиотеку абстракций ES5 для старого браузера.
Но опять-таки, никоим образом не побить собственные петли с точки зрения производительности.
+1 для ответа "test it" от Эмиля:) Это всегда правильный ответ.
Но да, нативные петли выигрывают, и вы можете сделать это лучше, кэшируя длину, поэтому ссылка .length не оценивается на каждой итерации.
for(var i = 0, l = list.length; i < l; i++)
или избегайте дополнительного var, делая это назад
for(var i = list.length-1; i >= 0; i--)
И если вы можете "встроить" "someFunction", это будет еще быстрее. В принципе, избегайте вызовов функций и ссылок в максимально возможной степени. Но это только если вы действительно смотрите на мелкие детали. Это маловероятно, что такие оптимизации будут иметь большое значение. Всегда проверяйте свои узкие места.
Создайте тестовые примеры с кодом html/javascript на jsperf.
Вы сможете увидеть, что лучше всего работает, и как быстро разные браузеры выполняют циклы.
Я бы поместил свои деньги в собственный JavaScript-цикл, но вы никогда не знаете.