C는 C ++보다 훨씬 빠릅니다.


83

내가 이해하는 한 모든 스크립팅 언어와 핵심 과학 프로그램은 일반적으로 C로 작성됩니다. 이것은 구현을 지저분하지만 요점으로 곧바로 렌더링합니다.

나는이 사람들이 성능을 극대화하고 싶어하지만 C 문자열과 C 구조를 사용하는 것과 C ++ 클래스를 사용하는 것 사이에 실제적인 차이가 있다는 것을 이해합니다. C ++는 가상 함수를 제외하고 동일한 방식으로 작동하는 것처럼 보입니다. 클래스 함수를 한 번 저장하고 해당 클래스의 모든 인스턴스가 해당 함수를 호출합니다.

C를 더 빠르게 만드는 것은 무엇이며 가장 빨라야하는 python 또는 sqlite와 같은 프로젝트에서 주목할만한 차이점입니까?


9
"당신은 당신이 직면 한 실제 문제를 바탕으로 실용적이고 대답 가능한 질문을해야합니다." -stackoverflow FAQ.
— RedGrittyBrick

2
"어떤 언어로든 잘 작성된 코드는 다른 언어로 잘못 작성된 코드보다 항상 낫습니다."
— Kerrek SB

5
@Will-아니요. "언어가 다른 언어보다 빠릅니다"는 대답 할 수 없습니다. 언어는 빠르지 않고 구현 만 가능합니다. "언어의 X 구현이 다른 Y 구현보다 빠르나요?" 프로파일 링으로 답변 할 수 있지만 무엇을 프로파일합니까? 언어 구현은 다양한 영역에서 빠르거나 느릴 수 있으며 모든 영역을 테스트하는 것은 의심 할 여지없이 불가능합니다. 더 나은 질문은 "왜 언어 디자이너가 Y 언어 대신 X 언어를 선택합니까?"입니다. 그것은 명확한 대답 (다른 언어 디자이너가 제시 한 근거)을 가지고 있으며 도움이 될 가능성이 더 높습니다.
— Chris Lutz

3
C와 C ++의 동일한 코드는 일반적으로 정확히 동일한 속도로 실행 되어야합니다. 단, 다른 앨리어싱 규칙 등으로 인해 의미가 다른 코드는 예외입니다. 차이점은 C 관용구와 C ++ 관용구 사이에 있습니다. C 또는 C ++에서 모범 사례 C 관용구를 사용하여 코드를 작성하는 경우 일반적으로 모범 사례 C ++ 관용구로 작성된 유사한 기능보다 훨씬 가볍고 빠릅니다 (처리 할 실패 사례가 적음) (작성 여부에 관계없이) C 또는 C ++), 작성하는 데 더 많은 작업이 필요할 것입니다.
— R .. GitHub의 STOP 돕기 ICE

9
C는 C ++보다 전체적으로 배우는 것이 훨씬 빠릅니다.)
— fredoverflow

답변:


68

C ++는 종종 과학 프로그램에 사용됩니다. C의 인기는 그 영역에서 줄어들 수 있습니다. Fortran은 "저수준"언어로 여전히 인기가 있습니다.

C ++에서는 "사용한만큼만 지불합니다." 따라서 C보다 느리게 만드는 것은 없습니다. 특히 과학 프로그램의 경우 표현식 템플릿을 사용하면 템플릿 엔진을 사용하여 프로그램 시맨틱을 처리하는 사용자 지정 최적화를 수행 할 수 있습니다.

Python과 같은 프로젝트에서 C가 선호되는 이유는 읽기가 덜 혼란스러워서 더 큰 기여자 풀이 대규모 코드베이스에 더 쉽게 액세스 할 수 있기 때문입니다.

SQLite는 작은 실행 코드 크기에 대한 요구 사항이 있으며 C에는 약간의 우위가 있습니다. C ++를 현명하게 사용하면 여전히 임베디드 애플리케이션에서 사용할 수 있지만 원하지 않는 언어 기능이 침투 할 수 있다는 두려움 때문에 덜 인기가 있습니다.


10
C ++는 이름 맹 글링을 수행하지만 C는 그렇지 않습니다. 이렇게하면 다른 언어가 C와 직접 인터페이스하는 것이 더 쉬워집니다. (swig는 실제로 C ++ 라이브러리에 대한 python 래퍼를 만들기 전에 C ++ 코드에 대한 C 인터페이스를 빌드합니다.)
— Sam P

8
@SamP C ++에는 이름 맹 글링을 비활성화하는 기능이 extern "C"있습니다. Swig는 C를 언어로 사용하지만 C ++의 C 호환 하위 집합 내에서 해당 래퍼를 구현하고 C 컴파일러를 호출하지 않을 수 있습니다.
— Potatoswatter 2015 년

"SQLite는 실행 가능한 코드 크기가 작아야합니다. C는 약간 우위를 가지고 있습니다." 나는 관용적 C ++로 작성된 SQLite가 C 구현보다 더 크거나 느릴 것이라고 생각하지 않습니다. 확실히 C ++ 코드가 훨씬 적을 것이며 선택적 LINQ 및 컴파일 타임 쿼리 사전 최적화 및 컴파일을 제공 할 수 있습니다. C는이를위한 코드 생성기가 필요하므로 SQLITE를 사용하면 쿼리를 미리 컴파일 할 수 없습니다. C ++ SQLITE를 사용하면 개입하는 VM 코드없이 range-for로 레코드를 반복 할 수 있으며 C SQLITE가 비교해 보면 속도가 느리게 보입니다. 너무 나쁜 ...
— 쿠바 모니카 잊지 않고있다

실제로 일반적인 크기를 고려하는 임베디드 SQLITE 애플리케이션에는 고정 된 쿼리 세트가 있으며 데이터베이스는 고정 된 스키마를 사용하여 플래시에서 메모리 매핑되며 SQL 인터프리터와 VM은 다른 많은 코드와 마찬가지로 무의미합니다. 필자는 SQLITE에서 저수준 페이지 액세스를 사용하여 "원시"C를 사용하여 쿼리를 작성하는 몇 가지 실험을 수행했으며 특정 응용 프로그램의 경우 SQLITE 코드의 85 %를 다소 버릴 수 있습니다. 따라서 SQLITE는 C ++를 활용하지 않음으로써 큰 ​​시간을 허비하지만 C ++를 사용할 수없는 플랫폼을 대상으로하며 쿼리 용 C 코드 생성기를 구현하지 않았습니다.
— 쿠바는 Monica를 잊지 않았습니다.

@UnslanderMonica 1. C ++ 바이너리에는 예외 처리 테이블이있어 비어있는 경우에도 여백을 추가합니다. 2. SQLite는 바이트 코드 기반입니다. C ++의 컴파일 타임 쿼리 최적화는 포인터를 사용할 수없는 constexpr 함수의 구문 분석 및 분석을 의미합니다. 이는 제품이 더 이상 SQLite가 아닌 아키텍처 변경을 의미합니다. 3. 바이트 코드를 저장하고 응용 프로그램 및 라이브러리 바이너리에서 텍스트와 파서를 제거하는 방법이 없습니까? 4. 파서가 없거나 "헤드가없는"SQLite는 C ++ 헤더 전용 바이트 코드 생성기 / 최적화 기와 인터페이스 할 수 있습니다.
— Potatoswatter

27

나는 그 이유가 상호 운용성만큼 성능과 많이 관련이 있다고 생각하지 않습니다. C ++ 언어는 C 언어보다 더 복잡하지만 성능 측면에서 어느 쪽이든 눈에 띄는 차이가 있어서는 안됩니다. 일부 C ++ 구문은 C에 해당하는 std::sort것보다 빠르며 (보다 빠름 qsort) 다른 방법에 대한 좋은 예가있을 수 있습니다.

편집 : 상호 운용성 측면에서 ...

기본적으로 C ++ 표준은 다른 컴파일러 / 버전으로 생성 된 바이너리 간의 쉬운 상호 운용성을 위해 필요할 수있는 몇 가지 사항을 정의하지 않습니다. 여기서 가장 주목할만한 문제는 바이너리의 기호에 대한 명명 규칙입니다. C에서 언어는 코드의 각 기호에서 이진 기호 이름으로의 단일 매핑을 정의합니다. 호출 된 함수는라는 my_function바이너리에 기호를 생성합니다 my_function. 반면에 함수 오버로딩과 같은 기능으로 인해 C ++ 함수의 이름을 엉망 으로 만들어야합니다.(이진의 다른 함수 기호로 변환되어 인수 및 반환 유형의 유형을 인코딩) 표준은 맹 글링이 수행되는 방법을 정의하지 않습니다. 이는 C ++의 동일한 함수가 컴파일러에 따라 다른 기호로 컴파일 될 수 있음을 의미합니다 ( extern "C"C ++에서 해당 함수에 대해 C 상호 운용성을 강제하는 데 사용 되지 않는 한 ).

결국, 스크립팅 언어와 네이티브 코드 간의 인터페이스는 내부적으로 구현되는 방법에 대한 세부 정보가 C / C ++ / 다른 네이티브 언어 일 수 있더라도 어쨌든 C 인터페이스 여야합니다.

(저는 의도적으로 언어 전쟁에 뛰어 들고 싶지 않습니다. C ++는 정말 강력하지만 C보다 훨씬 더 복잡한 언어이기 때문에 약간 무섭고 단순 해 보이는 것들이 영향을 미칠 수 있습니다. 공연)


2
현대의 관용적 C ++에는 인라인, RVO, 상수 폴딩 등을 최대한 활용하기 위해 지능형 컴파일러가 필요하다고 자신있게 말할 수 있습니다. 이로 인해 무거운 C ++ 구성이 전혀 눈에 띄지 않을 가능성이 전적으로 가능합니다. 머신 수준이지만, 좋은 컴파일러는 C보다 C ++에서 훨씬 더 중요합니다.
— Kerrek SB 2011 년

@Kerrek SB : 대부분의 최신 C ++ 컴파일러 (최신은 지난 2 년을 의미 함)는 관용적 C ++ 구조를 식별하고 최적화하는 데 정말 뛰어납니다. 는 std::sort: 하나의 예이다 std::less기본적으로 사용 펑은 해당 C 함수를보다 효율적 아니지만, 내가 아는 모든 컴파일러는 (은 인라인에 사용할 수있는 템플릿 인)을 인라인과의 함수 호출을 모두 제거합니다 compare펑합니다.
— David Rodríguez-dribeas 2011-08-05

재미있게도, Electronic Arts의 EASTL 라이브러리는 GCC가 인라인에 좋지 않다는 (그리고 MSVC가 훨씬 더 낫다는 것을) 발견했기 때문에 표준 라이브러리가 최적화되지 않은 함수 호출을 너무 많이 발생시킬 것이라는 주장에 의해 부분적으로 정당화됩니다. EASTL에서는이 문제에 맞서기 위해 더 적은 간접 사용을 사용합니다. 요즘 그 추론이 얼마나 잘 유지되는지 누가 알겠습니까?
— Kerrek SB 2011 년

13

Bjarne이 [D & E]에서 언급했듯이 효율성은 C ++의 주요 목표 중 하나입니다. 따라서 프로그래머가 언급 한 가상 함수, rtt 정보 등과 같은 "추가"기능을 사용할 때만 C ++가 느려집니다.

그래서 저는 그것이 더 심리적 인 이유라고 생각합니다. C는 "느린"C ++ 기능을 허용하지 않기 때문에 사용됩니다.


9

언어는 본질적으로 더 빠르거나 느리지 않으며 인터프리터와 컴파일러는 다소 효율적일 수 있습니다.

그 외에도 높은 수준의 언어는 일반적으로 런타임 비용이 드는 추상화 계층을 제공합니다. 만약 당신이 그것들을 사용하지 않는다면, 컴파일러는 그것들을 제거 할만큼 똑똑 할 수도 있지만, 언어의 의미론이 그것을 안전하게 할 수 없다면 불가능할 수도 있습니다. 낮은 수준의 언어는 "느린"언어를 사용하는 것보다 느릴 것입니다.


25
당신이 진정으로 끔찍한 컴파일 된 코드를 작성하지 않는 한 스크립팅 언어는 inheritantly 느린 후 컴파일 된 것들입니다
— Will03uk

2
@ Will03uk-일반적으로 스크립트 언어로 컴파일러를 작성하지 못하게하는 이유는 무엇입니까?
— Chris Lutz 2011 년

6
@Chris는 스크립트 언어가 아닙니다. 스크립트 언어의 의미는 해석되거나 바이트 코드가 컴파일된다는 것입니다. 컴파일하면 컴파일 된 언어가
— 아닙니까

1
이것은 전체 진실이 아닙니다. 언어 의미론은 최적화 프로그램이 사용할 수있는 정보를 결정하고 전체 프로그램 분석을 수행하지 않고도 어떤 가정을 안전하게 만들 수 있는지 결정하기 때문에 중요합니다. 예 : restrictC 또는 luajit 의 키워드-후자는 Mike가 똑똑한 사람이기 때문에 동적 언어에 대한 다른 모든 vm을 날려 버리지는 않지만 Lua의 의미가 꽤 깨끗하기 때문에 (예 : JavaScript와 비교하여)
— Christoph

1
@Christoph 내가 말하려는 것은 은색 총알이 없다는 것입니다. 동적 디스패치, 가상 호출, 코드의 핫 로딩 또는 덕 타이핑과 같은 것이 필요한 경우, 즉시 사용할 수있는 "느린"언어가 C의 순진한 구현보다 빠를 것입니다.
— fortran
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.