[실험환경]
- CPU : AMD Ryzen 7 1700 8-Core Processor
- Memory : 32.0 GB
- OS : Windows 10 Pro
- 데이터 개수 : 2천만개 ~ 3억 2천만개
- 스레드 개수 : 16개
- 값의 범위 : 0 ~ 1,000,000,000
[분석]
- 데이터 개수가 적을 때는 Node.js 가 가장 느린 성능을 보여주었으며, 데이터 개수가 증가함에 따라 Node.js가 Go를 제치고 더 빠른 성능을 보여주었다.
- Node.js는 멀티스레드를 사용하기 위해 worker_thread를 사용하는데, 각 스레드들이 수행할 작업이 적힌 스크립트 파일 (js)을 읽어서 수행하기 때문에 초반에 지연이 걸리게 되었다.
- 모든 경우에서 C++가 가장 빠른 속도를 보여주었다.
- 데이터 개수가 1억 6천만개 일 때, Node.js의 수행속도가 Go를 제쳤으며, 이후로 데이터 개수가 증가할수록 수행시간의 격차가 점점 더 벌어지게 되었다.
[결론]
- 세 개의 언어 중 유일하게 인터프리트 언어임에도 Node.js는 버전이 점점 증가함에 따라 JIT로 인한 성능 개선과 멀티스레드 기능을 제공하게 되면서 웬만한 컴파일 언어 못지않는 성능을 보여주게 되었다.
- 본업에서 Node.js 위주로 작업하면서 항상 드는 생각이 "Go언어가 성능 면에서 Node.js보다 항상 좋을까?"라는 궁금증을 갖고 있었는데, 이 기회에 미약하게나마 두 언어의 수행성능 차이를 눈으로 확인하게 되어 속이 후련해졌다.
- 또한, Go언어는 나에게 낯설게 느껴졌던 언어인데, 같은 로직의 퀵정렬을 Go언어에서 작성할 때, 작성 규칙이 굉장히 엄격해서 초반에 약간 애를 먹었다. 같은 기능을 작성할 때 Go언어는 오직 하나의 문법으로만 제공하겠다는 의지가 느껴졌다. 선언해놓고 사용하지 않는 변수에 대해 오류가 발생한다든지, import 에 명시해두고 사용하지 않은 모듈에 대해 오류가 발생한다든지, 삼항연산자를 허용하지 않는다든지, while 문을 제공하지 않는다든지, if문에 반드시 중괄호를 사용해야 한다든지, 조건문에 ++i 를 사용할 수 없다든지 등의 여러 가지 Node.js에서 당연하게 사용하던 문법들이 허용되지 않아 코드량이 더 많아졌고, 이게 더 효율적인 방법인지에 대한 의구심도 들었다. 아직 제대로 사용하지 않았기 때문에 섣부른 결론은 내리지 않기로 했다.
- 어쨌든, Node.js 도 멀티스레드를 활용하여 Go 못지 않는 성능을 보여줄 수 있다는 것을 확인하였다.
[소스]
- 시간측정에 사용된 각 언어별 소스코드는 Github에서 확인할 수 있다.
'컴퓨터 공학' 카테고리의 다른 글
[번역] Git 커밋 메시지를 작성하는 방법 (0) | 2022.01.13 |
---|---|
코드 이름 표기법 종류 (0) | 2022.01.12 |
[요약] 2019년 네이버 검색 서비스에 사용된 MongoDB 시행착오 정리 (0) | 2021.04.17 |
AES 암호화 알고리즘 조사 (0) | 2021.04.17 |
2019년 국가 별 개발자 연봉 (0) | 2021.03.19 |