본문 바로가기

Backend/Node.js

[Node.js] Date 라이브러리 퍼포먼스 비교

- 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