Есть ли реальная польза от использования метода JavaScript (Array Reduce)? - PullRequest
18 голосов
/ 09 марта 2012

Большинство случаев использования метода redu () можно легко переписать с помощью цикла for. А тестирование на JSPerf показывает, что slow () обычно медленнее на 60-75%, в зависимости от операций, выполняемых внутри каждой итерации.

Есть ли какая-либо реальная причина для того, чтобы использовать redu (), кроме возможности писать код в «функциональном стиле»? Если вы можете получить прирост производительности на 60%, написав немного больше кода, зачем вам когда-либо использовать redu ()?

РЕДАКТИРОВАТЬ: На самом деле, другие функциональные методы, такие как forEach () и map (), показывают одинаковую производительность, по крайней мере на 60% медленнее, чем простые циклы for.

Вот ссылка на тест JSPerf (с вызовами функций): forloop против forEach

1 Ответ

5 голосов
/ 09 марта 2012
  • Возможно, вы захотите оценить. Например, вы можете захотеть сделать функции обратного вызова или иметь ссылки на объекты javascript. Для получения дополнительной информации см., Почему javascript не блокируется. [edit: современный javascript теперь поддерживает let переменные. Еще до ESv6, когда вы объявляли переменную var, она поднималась так, как если бы она была написана в верхней части кодового блока функции, поэтому часто приходилось записывать тела циклов for в виде функций. Тем не менее, это относится и к следующему:] Если у вас написана функция, вполне возможно использовать функциональный стиль, если только это не является существенным узким местом.
  • Ваш код не всегда должен работать на полной скорости машины. Вы можете даже не оптимизировать код в узком месте.
  • Кроме того, вы не предоставляете свое "тестирование на JSPerf", поэтому мы можем критиковать его. Например, если у вас уже есть функция сокращения (или функция map или forEach), то держу пари, что производительность будет на уровне. Даже если это не так, методология тестирования может быть ошибочной, особенно если учесть, что многие браузеры могут по-разному оптимизировать или иметь разные издержки при вызове функции.

sidenote: это допустимое сравнение производительности между синтаксисами, но недопустимое сравнение производительности в тех случаях, когда синтаксис не рассматривается:

myArray.map(function(x){return x+1})

// ...versus...

for(var i=0; i<myArray.length; i++) {
    myArray[i] = myArray[i]+1;
}

Это будет правильное сравнение производительности:

myArray.forEach(function(x){return x+1})

// ...versus...

var plusOne = function(x){return x+1};
for(var i=0; i<myArray.length; i++) {
    plusOne(myArray[i]);
}

// (may need a side-effect if the compiler is smart enough to optimize this)

(Также в ответ на ваше редактирование: .forEach() и .map() обеспечивают гораздо большую ясность и избегают необходимости явного цикла int i=0; i<array.length; i++ аргументов.)

...