TL;DR

  • 정수에서 최대 8자리 문자열을 생성하는 벤치마크에서 C++ std::to_string이 Apple M4 Max 기준 초당 1억 8,380만 개로 가장 빠르며, 짧은 문자열 최적화가 주요 차이임.
  • 각 언어는 정수를 문자열로 변환하고, 생성 결과를 1,024칸 링 버퍼에 저장해 작업이 제거되지 않도록 구성함.
  • 측정 대상은 C++, Nim, Go, Node.js, Rust, Bun, Python이며, 각 결과는 다섯 번 실행한 최고치임.
  • 힙에 문자열을 할당하는 컴파일 언어인 Rust·Go·Nim은 JavaScript와 비슷한 초당 6,300만~8,600만 개 범위에 모임.
  • C++는 최대 8자리 문자열을 std::string 객체 내부에 저장해 메모리 할당자를 호출하지 않으며, 문자열당 5.4ns로 큰 격차를 보임.

벤치마크 방법

  • 각 언어에서 정수를 문자열로 변환하고 결과를 1,024칸 링 버퍼에 순환 저장함. 이 방식으로 실행 엔진이 변환 작업을 단순히 버리지 못하게 함.
  • Python은 str(i), JavaScript(Node.js와 Bun)는 String(i), C++는 std::to_string을 사용함.
  • Rust는 표준 to_string()과 빠른 정수 형식화용으로 설계된 인기 크레이트 itoa를 비교함. Go는 strconv.Itoa, Nim은 $ 연산자를 사용함.
  • 정수 범위는 0부터 1억까지이며, Python은 1,000만까지임. 따라서 각 문자열은 최대 8자리임.
  • Apple M4 Max에서 다섯 차례 실행한 결과 중 최고치를 보고함. C++는 -O3, Rust는 릴리스 모드, Nim은 -d:danger로 컴파일함.

초당 문자열 생성량

  • C++ std::to_string: 초당 1억 8,380만 개
  • Nim $i: 초당 8,590만 개
  • Go strconv.Itoa: 초당 8,430만 개
  • Node.js String(i): 초당 7,310만 개
  • Rust itoa: 초당 7,100만 개
  • Bun String(i): 초당 6,850만 개
  • Rust to_string(): 초당 6,360만 개
  • Python str(i): 초당 2,290만 개

결과 해석

  • Python은 문자열 하나당 44ns로 가장 느리며, JavaScript보다 약 3배, C++보다 약 8배 느림.
  • 문자열을 힙에 각각 할당하는 컴파일 언어인 Rust·Go·Nim은 JavaScript와 비슷한 성능 범위인 문자열당 12~16ns에 해당함. Rust의 표준 to_string()은 Node.js와 Bun보다도 다소 느림.
  • Go와 JavaScript 같은 가비지 컬렉션 런타임은 수명이 짧은 작은 객체를 다수 할당하는 작업에서 매우 좋은 성능을 보임.
  • C++는 문자열당 5.4ns로 큰 차이로 앞섬. std::string의 짧은 문자열 최적화(Small String Optimization)가 짧은 문자열을 객체 내부에 직접 저장하기 때문임. 문자열이 최대 8자리이므로 메모리 할당자를 호출하지 않음.

실행 환경과 출처

  • 사용 버전은 macOS 15.7.7, CPython 3.14.5, Node.js 25.9.0, Bun 1.4.2, Apple clang 17.0.0(clang-1700.6.4.2, libc++), rustc 1.94.1과 itoa 1.0.18, Go 1.24.3, Nim 2.2.12임.
  • 출처는 Daniel Lemire의 블로그에 2026년 9월 25일 게시된 글임: How many strings can you create per second?.
  • BibTeX