- Do What?
지난번 글에서 Moment.js 의 대체 Date 라이브러리인 Luxon, Day.js, date-fns, js-Joda 4가지 라이브러리의 사용법과 관련 함수들에 대해 봤었습니다. 이번엔 이어서 퍼포먼스와 기타 지표를 비교하려고 합니다.
각 라이브러리에서 주로 사용하는 timezone, offset 에 의한 Date 변환 시 소요 시간을 확인해보려 합니다.
- Day.js
const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');
const timezone = require('dayjs/plugin/timezone');
dayjs.extend(utc);
dayjs.extend(timezone);
const list = new Array(1); // test from 1 to 100000
console.time('Day.js');
for (let i = 0 ; i < list.length ; i++) {
dayjs.tz('2021-02-10 12:00:00', 'America/New_York');
}
console.timeEnd('Day.js');
배열의 길이를 늘려가며 소요 시간을 체크했을 때 결과는 아래와 같습니다.
배열 길이 | 소요 시간 (ms) |
1 | 2.945 |
100 | 12.183 |
10000 | 439.28 |
100000 | 3869.856 |
동일한 테스트를 이번엔 timezone 이 아닌 offset 으로 바꿔 진행해보겠습니다.
...
for (let i = 0 ; i < list.length ; i++) {
dayjs('2021-02-10 12:00:00').utcOffset(-240);
}
...
배열 길이 | 소요 시간 (ms) |
1 | 0.591 |
100 | 1.923 |
10000 | 42.297 |
100000 | 179.493 |
마찬가지로 배열의 길이가 증가할수록 소요 시간 또한 증가하지만, timezone 변경에 비하면 offset 을 통한 Date 변경이 훨씬 빠르다는 걸 알 수 있습니다.
- Luxon
const { DateTime} = require('luxon');
const list = new Array(1); // test from 1 to 100000
console.time('Luxon');
for (let i = 0 ; i < list.length ; i++) {
DateTime.local(2021, 2, 10, 12).setZone('America/New_York');
}
console.timeEnd('Luxon');
마찬가지로 배열의 길이를 1 부터 100000 까지 증가시키며 소요 시간을 측정했습니다.
배열 길이 | 소요 시간 (ms) |
1 | 4.962 |
100 | 8.903 |
10000 | 155.092 |
100000 | 1117.042 |
동일하게 offset 을 통한 변경도 테스트해보겠습니다.
...
for (let i = 0 ; i < list.length ; i++) {
DateTime.local(2021, 2, 10, 12).toUTC(-240);
}
...
배열 길이 | 소요 시간 (ms) |
1 | 3.336 |
100 | 5.586 |
10000 | 50.476 |
100000 | 197.687 |
Luxon 도 Day.js 와 동일한 결과를 보입니다.
Day.js 와 Luxon 두 라이브러리만 비교했을 땐 timezone 을 변경하는 경우 아이템 갯수가 늘어날수록 Luxon 이 유리해 보이며, offset 을 통한 변경에는 큰 차이가 없어 보입니다. (@js-joda/core 과 date-fns 두 라이브러리는 timezone 및 offset 에 의한 Date 변경 함수가 직관적이지 않고 사용성이 좋지 않다고 판단하여 생략했습니다)
- Github 지표 (2021.04 기준)
Github 지표는 어찌보면 무의미할 수도 있지만, 많이 쓰는 라이브러리일수록 검증이 되었다는 반증이라고도 볼 수 있습니다.
library | weekly-download | contributor | last update | version | size |
Day.js | 5,063,170 | 246 | 3달전 | 1.10.4 | 587kB |
Luxon | 1,380,058 | 135 | 2달전 | 1.26.0 | 3.05MB |
@js-joda/core | 241,151 | 40 | 7달전 | 3.2.0 | 3.99MB |
date-fns | 10,120,897 | 317 | 3일전 | 2.21.1 | 5.84MB |
date-fns 를 상당히 많이 쓴다는 점이 놀라웠습니다. 기존 Javascript 의 native Date 객체를 그대로 사용 가능하다보니 많이 쓰이는 듯 합니다.
- Conclusion
위 4가지 라이브러리는 모두 Typescript 를 지원하고, 이전 글에서 쓴 것처럼 Immutable 이라는 장점이자 공통점이 있습니다.
@js-joda/core 는 다른 라이브러리들에 비해 여러 면에서 뒤쳐지는 느낌입니다. 이러한 비교를 참고삼아 Moment.js 대체 라이브러리를 결정하시면 좋을 듯 합니다. (개인적으로는 여러 지표를 종합했을 때 Day.js 와 Luxon 둘 중 하나를 사용할 것 같습니다)
'Backend > Node.js' 카테고리의 다른 글
package-lock.json 이란? (0) | 2022.01.22 |
---|---|
axios configs 정리 (0) | 2021.04.18 |
[Node.js] Date 라이브러리 비교 (0) | 2021.02.27 |
[Node.js] Http 라이브러리 비교 (3) | 2020.06.08 |
Node.js v14 - Optional Chaining / Nullish / Intl.* (0) | 2020.05.06 |