Я протестировал следующие 5 функций на jsbench.me (ссылка ведет на сохраненные тесты):
const data = [1,2,3,4,5,6,7,8,9,0,99,88,77,66,55,44,33,22,11]
const fn1 = xs => xs.reduce((acc, x) => acc > x ? acc : x, -Infinity)
const fn2 = xs => {
let res = -Infinity
for (const x of xs) res = x > res ? x : res
return res
}
const fn3 = xs => {
let res = -Infinity
for (const x of xs) {
if (x > res) res = x
}
return res
}
const fn4 = xs => xs.reduce((acc, x) => Math.max(acc, x), -Infinity)
const fn5 = ([x, ...xs], acc = -Infinity) =>
x == undefined ? acc : fn5(xs, x > acc ? x : acc)
Самая быстрая функция на сегодняшний день - это # 1 на основе Array.prototype.reduce
и избегая переназначения.
Функции # 2 - # 4 (включая вашу исходную функцию и функцию с потенциальным улучшением производительности, которую вы предложили) все на 40-55% медленнее, чем # 1. # 4 (reduce
с Math.max
), по-видимому, стабильно быстрее, чем # 2 и # 3, примерно на 20%.
Самая медленная функция (которая зависит от рекурсии) - это # 5, с тактовой частотой около На 80-90% медленнее, чем # 1.
Math.max(x, y)
медленнее, чем x > y ? x : y
.
Я тестировал на MacBook Pro 2019 с MacOS 10.15.1 (Catalina) и Chrome v79.0.3945.88 (64 бита). Вы можете получить разные результаты с другой настройкой теста, но я уверен, что решение, основанное на reduce
и избежании переназначения, будет самым быстрым вариантом в большинстве современных браузеров.