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.