Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 17.05.2021, 12:11
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

voraa, оригинальный
https://javascript.ru/forum/misc/810...tml#post536666

Не твоя модификация.
Ответить с цитированием
  #12 (permalink)  
Старый 17.05.2021, 12:29
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

Я про него и спрашиваю.
Не вижу я там никакого массива.
Там всего 3 переменные используются a - исходный массив, b - строка, ну и i.
Ответить с цитированием
  #13 (permalink)  
Старый 17.05.2021, 12:33
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от voraa
Не вижу я там никакого массива.
Это меня уже глаза подводят...
Ответить с цитированием
  #14 (permalink)  
Старый 17.05.2021, 12:33
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

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 среда

Последний раз редактировалось Vlasenko Fedor, 17.05.2021 в 13:36. Причина: Поправил равенство стр 26 см. @voraa
Ответить с цитированием
  #15 (permalink)  
Старый 17.05.2021, 12:38
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Чем мне всегда нравилось здешнее сообщество - так это предоставляемые возможности, казалось бы на простых вопросах.
Ответить с цитированием
  #16 (permalink)  
Старый 17.05.2021, 13:15
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

Сообщение от Vlasenko Fedor
Вариант 4 здесь показывает скорость без преобразования в строку
Для чисел с которыми работает js NodeJs среда
Ну только строка 26 должна быть так
if (f === 1 || f === 2 || f === 5) b.push(ar[i])
А то массив b пустым получается

Это интересно. Даже несмотря на рекурсию этот вариант гораздо быстрее, чем преобразование в строку.
Видимо при таком количестве вызовов эта функция хорошо оптимизируется в ассемблерный код.

Но это в Хроме. Файрфокс не показывает таких хороших результатов. Там второй вариант все равно быстрее.

Последний раз редактировалось voraa, 17.05.2021 в 13:21.
Ответить с цитированием
  #17 (permalink)  
Старый 17.05.2021, 13:51
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Без рекурсии в 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 впереди планеты

Последний раз редактировалось Vlasenko Fedor, 17.05.2021 в 13:54.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование многомерного массива в строку и обратно Bond Общие вопросы Javascript 5 08.04.2015 13:16
преобразование массива с объектами в строку и обратно JustCrazy Элементы интерфейса 5 25.01.2015 18:15
Преобразование объекта в URL строку Hapson Общие вопросы Javascript 5 23.03.2014 11:44
Преобразование значения переменной в строку leny Общие вопросы Javascript 3 01.10.2011 22:34
Преобразование дробного числа в строку с пробелами между разрядами Mutagena Общие вопросы Javascript 3 28.03.2011 11:05