Сравнение библиотек для работы с датами в JavaScript

Дмитрий Кузнецов
Дмитрий Кузнецов · 18 ноября 2020
Backend

Предыстория

После очередного изменения в нашем сервисе расчёта доставки, увеличившего количество обрабатываемых ПВЗ, его время ответа значительно вышло за пределы допустимого. В ходе профилирования было установлено, что от 50 до 84% времени уходит на работу с датами.

Проблема

Больше всего времени уходило на приведение в ISO(400ms), прибавление дней к дате(180ms) и работу с таймзонами(200ms). В качестве библиотеки для работы с датами мы использовали Luxon.

Возможные решения

В процессе изучения вопроса, мы изучили Luxon, Date-fns, Dayjs и нативную дату:

🏎️ Производительность (на 1 000 000 операций)

💡 Luxon

☀️ Dayjs

📈 Date-fns

🤖 Native Date

🏖️ Удобство использования

💡 Luxon

☀️ Dayjs

📈 Date-fns

🤖 Native Date

📋 Дополнительно

В документации к Moment.js, предшественнику Luxon, присутствует статья со сравнением производительности разных библиотек:

Кол-во секунд на 1 000 000 операций

Результат

Было принято решение использовать Dayjs в пользу наиболее простой миграции.

🕓 Конечное время расчёта доставки

💡 Luxon

☀️ Dayjs

📈 Date-fns

График времени ответа, ступенька справа — результат после увеличения количества ПВЗ и замены Luxon на Dayjs

В заключение

Если вам нужна производительность — наилучшим решением будет написать свою обёртку над нативной датой. Если же вы не уверены — создайте абстракцию над используемой библиотекой, чтобы сделать миграцию наиболее простой и безболезненной.