원문 캡처 · lemire.me
원문 캡처 · lemire.me

단일 클라이언트 쌍이 서버를 거쳐 메시지를 주고받는 테스트에서 Node.js 26과 uWebSockets.js는 초당 4만9,000회 왕복을 기록했다. Deno 2.9.7은 4만 회, Bun 1.4.2는 3만7,000회였으며, 비교 대상인 C 릴레이는 5만4,000회였다.

이번 테스트는 몇 년 전 JavaScript 클라이언트로 진행한 벤치마크를 수정한 것이다. 당시에는 Bun 서버가 메시지를 클라이언트에 돌려보내는 오류가 있어 왕복을 두 메시지로 처리했고, 결과적으로 Bun이 Node.js보다 두 배 빠르다는 결론은 잘못됐다고 Daniel Lemire는 설명한다. 이번에는 클라이언트를 C로 작성했다.

테스트는 클라이언트 두 개가 서버를 거쳐 메시지를 주고받는 단일 핑퐁 방식으로 진행했다. Linux 서버의 Intel Xeon Gold 6548N(Emerald Rapids)에서 모든 구성 요소를 루프백 인터페이스로 실행했다. 서버에는 코어 하나를 할당하고 클라이언트는 다른 코어에서 실행했다. 벤치마크 전체를 세 차례 반복했으며, 결과는 몇 퍼센트 이내에서 안정적이었다고 한다.

측정 결과는 다음과 같다. 지연 시간은 왕복당 중앙값과 99백분위수다.

  • C 릴레이(기준): 초당 54,000회, 중앙값 18.4µs, 99백분위수 23.0µs
  • Node.js 26 + uWebSockets.js: 초당 49,000회, 중앙값 20.4µs, 99백분위수 24.8µs
  • Deno 2.9.7 + Deno.serve: 초당 40,000회, 중앙값 25.0µs, 99백분위수 32.0µs
  • Bun 1.4.2 + Bun.serve: 초당 37,000회, 중앙값 26.8µs, 99백분위수 46.4µs

이 테스트에서는 Node.js 26과 C++ 네이티브 애드온인 uWebSockets.js 조합이 Bun과 Deno보다 왕복 처리량이 높고 99백분위 지연 시간도 짧았다. 다만 결과는 단일 클라이언트 쌍을 사용하는 특정 로컬 테스트에 해당한다. 벤치마크 소스 코드는 GitHub 저장소에서 확인할 수 있다.

원문: Daniel Lemire, “WebSocket servers in JavaScript: Node.js, Bun and Deno in 2026”, 2026년 10월 10일.