Задать вопрос
  • Почему время наполнения массива отличается?

    @DeveleinDev Автор вопроса
    Lynn «Кофеман»
    Спасибо за статьи!
    Изучу и отпишу здесь, если найду в них ответ на свой вопрос
    Написано
  • Почему время наполнения массива отличается?

    @DeveleinDev Автор вопроса
    Запускал на nodejs 21.6.1 в терминале
    macOS Sonoma 14.3, m2, 16 ОЗУ

    WbICHA не подскажешь, где тестировал? (я про онлайн ноду)

    Я только что прогнал на https://www.jdoodle.com/execute-nodejs-online/
    100 000 000 элементов не получилось сделать, не хватило памяти.

    Для 50 000 000 старый - 1570, новый - 4422 (старый быстрее в 3 раза)
    Для 33 600 000 старый - 1540, новый - 4108 (старый быстрее в +- 2.5 раза)
    Для 33 500 000 старый - 1482, новый - 320 (новый быстрее в 5 раз)
    Для 10 000 000 старый - 458, новый - 96 (новый быстрее в 4.5 раза)

    Где-то между 33.500.000 - 33.600.000 происходит сильный перегиб между этими способами
    Написано
  • Почему время наполнения массива отличается?

    @DeveleinDev Автор вопроса
    Немного изменил функцию с наполнением по индексу, чтобы снять метрики детальнее
    const fillList = (size) => {
    
        console.log(`Наполняем массив размером ${size}`);
        const date = new Date();
    
        const list = new Array(size);
    
        const date2 = new Date();
        console.log(`Создали массив за ${date2.getTime() - date.getTime()}`);
        console.log(`Наполняем по индексу`);
    
        for (let i = 0; i < size; i++) {
            list[i] = i;
        }
    
        const date4 = new Date();
        console.log(`Наполнили за ${date4.getTime() - date2.getTime()}`);
    
        return list;
    };


    Результат
    Наполняем массив размером 100000000
    Создали массив за 0
    Наполняем по индексу
    Наполнили за 2536


    Так что да, для созданного таким образом массива push работает быстрее, чем наполнение по индексу)
    Написано
  • Почему время наполнения массива отличается?

    @DeveleinDev Автор вопроса
    Если push медленнее, чем обращение к индексу напрямую, то почему с push работает быстрее, чем с обращением к индексу напрямую?)
    Написано
  • Почему время наполнения массива отличается?

    @DeveleinDev Автор вопроса
    Alexandroppolus,
    Вот да

    По новому способу
    С одной стороны я думал, что это как раз будет единократным выделением памяти, в связи с чем при наполнении он не будет перестраиваться в памяти. Однако, затем я вспомнил, что это js)

    В js'е массив - тот же объект. А объекты реализованы hash-таблицами.
    В связи с чем моя догадка заключается в том, что он дольше работает, т.к. постоянно вычисляет hash, чтобы записать значение по нужному индексу, но могу быть не прав, поэтому хотелось увидеть мнение более опытных разработчиков

    Спасибо за наводку с Typed Arrays
    Если использовать Uint32Array, то время наполнения новым способом существенно сокращается (занимает 100мс вместо +-2600)
    Написано