|
Я про него и спрашиваю.
Не вижу я там никакого массива. Там всего 3 переменные используются a - исходный массив, b - строка, ну и i. |
Цитата:
|
const ar = Array.from({length: 1_000_000}, (_, i) => i)
let b;
console.time('V1');
b = ar.filter(num => [1, 2, 5].includes(+String(num).charAt(0)));
console.timeEnd('V1');
b = [];
console.time('V2');
for (let i = 0; i < ar.length; i++) {
const as = String(ar[i])[0];
if (as === '1' || as === '2' || as === '5') b.push(ar[i])
}
console.timeEnd('V2');
console.time('V3');
b = ar.filter(num => /^[125]/.test(num));
console.timeEnd('V3');
b = [];
const getFirstNumber = num => {
num = num / 10 | 0;
return num > 9 ? getFirstNumber(num) : num;
}
console.time('V4');
for (let i = 0; i < ar.length; i++) {
let f = getFirstNumber(ar[i]);
if (f === 1 || f === 2 || f === 5) b.push(ar[i])
}
console.timeEnd('V4');
Вариант 4 здесь показывает скорость без преобразования в строку Для чисел с которыми работает js NodeJs среда |
Чем мне всегда нравилось здешнее сообщество - так это предоставляемые возможности, казалось бы на простых вопросах. :thanks:
|
Цитата:
if (f === 1 || f === 2 || f === 5) b.push(ar[i]) А то массив b пустым получается Это интересно. Даже несмотря на рекурсию этот вариант гораздо быстрее, чем преобразование в строку. Видимо при таком количестве вызовов эта функция хорошо оптимизируется в ассемблерный код. Но это в Хроме. Файрфокс не показывает таких хороших результатов. Там второй вариант все равно быстрее. |
Без рекурсии в 8-10 раз быстрее в node
const ar = Array.from({length: 1_000_000}, (_, i) => i)
let b;
console.time('V1');
b = ar.filter(num => [1, 2, 5].includes(+String(num).charAt(0)));
console.timeEnd('V1');
b = [];
console.time('V2');
for (let i = 0; i < ar.length; i++) {
const as = String(ar[i])[0];
if (as === '1' || as === '2' || as === '5') b.push(ar[i])
}
console.timeEnd('V2');
console.time('V3');
b = ar.filter(num => /^[125]/.test(num));
console.timeEnd('V3');
b = [];
const getFirstNumber = num => {
while (num > 9) num = num / 10 | 0;
return num;
}
console.time('V4');
for (let i = 0; i < ar.length; i++) {
let f = getFirstNumber(ar[i]);
if (f === 1 || f === 2 || f === 5) b.push(ar[i])
}
console.timeEnd('V4');
и в браузерах уже V4 впереди планеты |
| Часовой пояс GMT +3, время: 12:14. |