러스트는 C보다 빠를까?

3 weeks ago 11

  • 러스트와 C의 성능 비교는 “모든 조건이 동일하다”는 전제의 정의에 따라 달라지는 복잡한 문제임
  • 인라인 어셈블리의 경우 두 언어 모두 동일한 어셈블리 코드를 생성할 수 있어, 언어 자체의 속도 차이는 없음
  • 구조체 메모리 배치에서는 러스트가 필드 재정렬을 통해 더 작은 크기를 가질 수 있으나, #[repr(C)] 속성으로 C와 동일한 레이아웃도 가능함
  • 런타임 검사와 개발자 행태 차이로 인해 실제 프로젝트에서는 코드 구조와 성능이 달라질 수 있음
  • 결론적으로 언어 자체의 한계로 인한 성능 차이는 없으며, 프로젝트와 개발자 요인에 따라 결과가 달라짐

인라인 어셈블리 비교

  • 러스트는 언어 차원에서 인라인 어셈블리를 지원하며, C는 컴파일러 확장 기능으로 이를 구현
    • 두 언어 모두 rdtsc 명령을 사용하는 동일한 예제를 작성할 수 있음
    • rustc 1.87.0과 clang 20.1.0에서 생성된 어셈블리는 완전히 동일한 형태로 출력됨
  • 이 사례는 언어의 성능 차이를 보여주지는 않지만, 러스트가 C와 동일한 수준의 저수준 제어를 수행할 수 있음을 입증

구조체 레이아웃 차이

  • 러스트 구조체는 필드 재정렬을 통해 메모리 사용을 최적화할 수 있음
    • 예시에서 러스트 구조체는 16바이트, 동일한 C 구조체는 24바이트로 계산됨
  • C에서는 필드 순서를 수동으로 변경해야 동일한 크기를 얻을 수 있음
  • 러스트에서 #[repr(C)] 속성을 사용하면 C와 동일한 메모리 레이아웃을 강제할 수 있음

사회적·개발자 요인

  • 러스트의 안전성 검사 덕분에 개발자가 더 공격적인 최적화를 시도할 수 있는 사례가 있음
    • Mozilla의 Stylo 프로젝트에서는 C++로 두 차례 병렬화 시도가 실패했으나, 러스트로는 성공적으로 구현됨
  • 동일한 프로젝트라도 언어와 개발자 숙련도에 따라 결과 코드의 성능과 안정성이 달라질 수 있음
  • 초급 개발자와 전문가, 언어 숙련도에 따라 “같은 작업”의 결과가 다르므로, 단순 비교는 어려움

컴파일 타임과 런타임 검사

  • 러스트의 많은 안전성 검사는 컴파일 타임에 수행되지만, 일부는 런타임 검사로 남음
    • 예를 들어 array[0] 접근 시 러스트는 경계 검사를 수행하지만, C는 수행하지 않음
    • 러스트에서 get_unchecked()를 사용하면 C와 동일한 동작을 얻을 수 있음
  • 컴파일러가 안전성을 증명할 수 있는 경우, 두 언어 모두 검사를 최적화로 제거할 수 있음
  • 이러한 차이는 코드 작성 방식에 영향을 주며, 결과적으로 성능 차이를 유발할 수 있음

결론

  • C가 “가장 빠른 언어”라고 가정하더라도, 러스트가 동일한 수준의 성능을 낼 수 없는 이유는 없음
  • 언어 자체의 한계보다는 프로젝트 특성, 개발자 역량, 시간 제약 등 외부 변수가 성능 차이를 결정
  • 따라서 “러스트가 C보다 빠른가?”라는 질문은 언어 비교보다는 엔지니어링 맥락의 문제로 해석됨

Read Entire Article