C++ vs Node.js vs Go - 멀티스레드 퀵정렬 수행속도 비교

"Real Life Buzz Light" from DALL-E 2

[실험환경]

  • 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에서 확인할 수 있다.