Итог : Доступ к диску действительно медленный .
Если вы можете создать файлы во временном местоположении заранее, перемещение файлов происходит относительно быстро. Но их создание выполняется медленно.
Каждый из циклов for
в вашем коде записывает файл 20 МБ на устройство хранения - один миллион итераций, каждая из которых добавляет 20 символов. В некоторых контекстах 20 МБ крошечные, а в других - ОГРОМНЫЕ. Это, вероятно, не будет мгновенным на большинстве аппаратных средств.
В зависимости от того, записываются ли эти данные на жесткий диск или SSD, производительность может сильно различаться. Если вы запускаете эту программу на устройстве с жестким диском, это почти наверняка объясняет большую часть задержки. Вы можете прочитать больше в Википедии .
Но давайте попробуем сделать это быстрее.
На моей машине я запускал ваш исходный код по крайней мере десять раз. Каждый прогон занимал примерно одинаковое количество времени, давал или занимал 0,2 секунды или около того. Это окончательное время:
первый метод: 1168,626 мс
второй метод: 939,847 мс
вся программа: 2113,624 мс
Программа фактически не завершилась, и второй На самом деле файл не записывался (сбрасывался) в течение 1-2 секунд после последнего вызова console.timeEnd
. Таким образом, эти два метода, вероятно, более похожи по производительности, чем указывают эти цифры.
Я попробовал некоторые оптимизации, которые не работали :
- Извлечение
characters
и charactersLength
к константам на уровне файла - Преобразование
makeid
results
в new Array(length)
с последующим нажатием и присоединением (это было замедлением ~ 1,8x, что меня удивило) - Рефакторинг
codes
в строку и использование конкатенации строк (это было в 2 раза медленнее для первого метода) - Приведение в порядок стиля кода (как и ожидалось, это не дало эффекта)
... и все. Я не смог значительно улучшить ваш код за 30 минут, которые я потратил на попытки.
Примечания и предостережения:
- Я запускаю прямо, запустив
node
в командной строке, а не на веб-сервере. - Я запускаю это на машине с SSD (PM981 NVMe Samsung 1024GB, согласно диспетчеру устройств).
- Первый Метод объединяет
codes
с символами новой строки, поэтому в итоге приходится писать на 1-2 МБ больше, чем во втором методе.