StackOverflow 팟 캐스트를 들으면서 b은 “실제 프로그래머”가 C로 작성하고 C가 “머신에 가깝기 때문에”훨씬 빠릅니다. 다른 게시물에 대한 이전 주장을 남겨두고 다른 언어보다 더 빠를 수있는 C의 특별한 점은 무엇입니까? 또는 다른 방법으로 말하면 다른 언어가 C만큼 빨리 실행되는 바이너리로 컴파일 할 수 없도록하는 것은 무엇입니까?
답변
C에 대해서는 특별한 점이 많지 않습니다. 이것이 빠른 이유 중 하나입니다.
가비지 수집 , 동적 입력 및 기타 기능을 지원하는 최신 언어로 프로그래머가 프로그램을보다 쉽게 작성할 수 있습니다.
캐치에는 응용 프로그램의 성능을 저하시키는 추가 처리 오버 헤드가 있습니다. C에는 그 중 하나가 없으므로 오버 헤드가 없다는 것을 의미하지만 프로그래머는 메모리 누수 를 방지하기 위해 메모리 를 할당하고 해제 할 수 있어야합니다. 해야하며 변수의 정적 입력을 처리해야합니다.
즉, Java ( Java Virtual Machine 사용 ) 및 .NET (Common Language Runtime 사용)과 같은 많은 언어와 플랫폼 은 기본 기계 코드를 생성하는 JIT (Just-In-Time) 컴파일 과 같은 출현으로 수년 동안 성능이 향상되었습니다. 더 높은 성능을 달성하기 위해 바이트 코드.
답변
C 디자이너가 만든 거래가 있습니다. 즉, 그들은 안전보다 속도를 높이기로 결정했습니다. C는하지 않습니다
- 배열 인덱스 범위 확인
- 초기화되지 않은 변수 값 확인
- 메모리 누수 확인
- 널 포인터 역 참조 확인
Java로 배열에 색인을 생성하면 가상 시스템에서 일부 메소드 호출, 바운드 검사 및 기타 온 전성 검사가 필요합니다. 그것은 유효하고 절대적 으로 좋습니다. 왜냐하면 그것이 예정된 곳에 안전을 추가하기 때문입니다. 그러나 C에서는 아주 사소한 것조차 안전하지 않습니다. 예를 들어 C에서는 복사 할 영역이 겹치는 지 확인하기 위해 memcpy가 필요하지 않습니다. 그건 하지 큰 비즈니스 응용 프로그램을 프로그래밍하는 언어로 설계.
그러나 이러한 디자인 결정은 C 언어의 버그 가 아닙니다 . 컴파일러와 라이브러리 작성자가 컴퓨터에서 모든 성능을 얻을 수 있도록 설계되어 있습니다. 다음은 C 이론 문서에서 설명 하는 C 의 정신입니다 .
C 코드는 이식 할 수 없습니다. 프로그래머가 실제로 이식 가능한 프로그램을 작성할 수있는 기회를 제공하기 위해 노력했지만위원회는 프로그래머를 이식 가능하게 작성하여 C를“고수준 어셈블러 ”로 사용하는 것을 배제하기를 원하지 않았습니다. 코드는 C의 장점 중 하나입니다.
C의 정신을 유지하십시오. 위원회 는 C 의 전통적인 정신을 보존하기위한 주요 목표로 유지했습니다. C의 정신에는 여러 가지 측면이 있지만, 본질은 C 언어의 기반이되는 기본 원칙에 대한 공동체의 정서입니다. C의 정신의 일부 측면은 다음과 같은 문구로 요약 될 수 있습니다.
- 프로그래머를 신뢰하십시오.
- 프로그래머가 수행해야 할 작업을 방해하지 마십시오.
- 언어를 작고 단순하게 유지하십시오.
- 작업을 수행하는 한 가지 방법 만 제공하십시오.
- 휴대 성이 보장되지 않더라도 빨리 만드십시오.
마지막 잠언에는 약간의 설명이 필요합니다. 효율적인 코드 생성 가능성은 C의 가장 중요한 강점 중 하나입니다. 매우 간단한 작업으로 보이는 코드 폭발이 발생하지 않도록하기 위해 많은 작업이 대상 시스템의 하드웨어가 아닌 일반적인 추상 규칙. 기계가하는 것과 함께 살려는 이러한 의지의 예는 표현식에 사용하기 위해 char 객체의 확장을 결정하는 규칙에서 볼 수 있습니다. 대상 머신에서 효율적입니다.
답변
한 달 동안 0.05 초 안에 실행되는 무언가를 빌드하고 Java로 같은 것을 쓰는 데 하루를 보내고 0.10 초 안에 실행하면 C가 더 빠릅니까?
그러나 귀하의 질문에 대답하기 위해, 잘 작성된 C 코드는 일반적으로 다른 언어로 작성된 잘 작성된 코드보다 빠르게 실행됩니다. C 코드 “잘 작성”의 일부에는 기계 근처에서 수동 최적화를 수행하는 것이 포함되기 때문입니다.
컴파일러는 실제로 매우 영리하지만, 여전히 손에 의한 알고리즘과 경쟁하는 코드를 창의적으로 만들 수는 없습니다 ( “손”이 우수한 C 프로그래머에 속한다고 가정 ).
편집하다:
많은 의견이 “C로 작성하고 최적화에 대해서는 생각하지 않습니다”라는 문구를 따릅니다.
델파이에서는 이것을 쓸 수 있습니다 :
function RemoveAllAFromB(a, b: string): string;
var
before, after :string;
begin
Result := b;
if 0 < Pos(a,b) then begin
before := Copy(b,1,Pos(a,b)-Length(a));
after := Copy(b,Pos(a,b)+Length(a),Length(b));
Result := before + after;
Result := RemoveAllAFromB(a,Result); //recursive
end;
end;
그리고 CI에서 이것을 작성하십시오 :
char *s1, *s2, *result; /* original strings and the result string */
int len1, len2; /* lengths of the strings */
for (i = 0; i < len1; i++) {
for (j = 0; j < len2; j++) {
if (s1[i] == s2[j]) {
break;
}
}
if (j == len2) { /* s1[i] is not found in s2 */
*result = s1[i];
result++; /* assuming your result array is long enough */
}
}
그러나 C 버전에는 얼마나 많은 최적화가 있습니까? 우리는 델파이 버전에서 생각하지 않는 구현에 대해 많은 결정을합니다. 문자열은 어떻게 구현됩니까? 델파이에서는 보이지 않습니다. C에서는 ASCII 정수 배열에 대한 포인터가 될 것이라고 결정했습니다.이를 정수라고합니다. C에서는 한 번에 하나씩 문자 존재를 테스트합니다. 델파이에서는 Pos를 사용합니다.
그리고 이것은 단지 작은 예입니다. 큰 프로그램에서 C 프로그래머는 몇 줄의 코드로 이러한 종류의 낮은 수준의 결정을 내려야합니다. 수작업으로 제작 된 수작업으로 최적화 된 실행 파일을 추가합니다.
답변
나는 그것을 보지 못 했으므로 말할 것입니다 : C는 거의 모든 것이 C로 작성되기 때문에 더 빠릅니다 .
Java는 C로, Python은 C (또는 Java 또는 .NET 등), Perl 등으로 작성됩니다. OS는 C로 작성되고 가상 머신은 C로 작성되고 컴파일러는 C로 작성됩니다. 인터프리터는 C로 작성됩니다. 일부는 여전히 어셈블리 언어로 작성되며, 속도가 훨씬 빠릅니다. 점점 더 많은 것들이 다른 것으로 작성되고 있으며, 그 자체가 C로 작성되었습니다.
어셈블리가 아닌 다른 언어로 작성하는 각 명령문은 일반적으로 C의 여러 명령문으로 구현되며 기본 머신 코드로 컴파일됩니다. C보다 더 높은 수준의 추상화를 얻기 위해 다른 언어가 존재하는 경향이 있기 때문에 C에 필요한 추가 설명은 안전성 추가, 복잡성 추가 및 오류 처리에 중점을 두는 경향이 있습니다. 그것들은 종종 좋은 것이지만, 비용이 있으며, 그 이름은 속도 와 크기 입니다.
개인적으로, 나는 가용 한 스펙트럼의 대부분에 걸쳐 문자 그대로 수십 개의 언어로 작성했으며, 개인적으로 당신이 암시하는 마술을 찾았습니다.
케이크도 먹고 먹을 수 있습니까? 내가 좋아하는 언어로 높은 수준의 추상화를 사용하여 연주하고 어떻게 C의 핵심에 빠뜨릴 수 있습니까?
몇 년의 연구 끝에 제 대답은 Python (C)입니다. 당신은 그것을보고 싶을 수도 있습니다. 그건 그렇고, 파이썬에서 어셈블리로 드롭 다운 할 수도 있습니다 (특별 라이브러리의 약간의 도움으로).
반면에 잘못된 코드는 모든 언어로 작성할 수 있습니다 . 따라서 C (또는 어셈블리) 코드는 자동으로 더 빠르지 않습니다 . 마찬가지로 일부 최적화 트릭은 고급 언어 코드의 일부 를 원시 C의 성능 수준에 가깝게 만들 수 있습니다. 그러나 대부분의 응용 프로그램에서 프로그램은 대부분의 시간을 사람이나 하드웨어를 기다리는 데 소비하므로 차이는 중요하지 않습니다.
즐겨.
답변
거기에는 많은 질문이 있습니다. 대부분 대답 할 자격이없는 질문입니다. 그러나이 마지막 것에는 :
다른 언어가 C만큼 빨리 실행되는 바이너리로 컴파일 할 수 없도록하는 것은 무엇입니까?
한마디로 추상화.
C는 기계어에서 한 단계 또는 두 단계의 추상화입니다. Java 및 .Net 언어는 어셈블러에서 최소 3 단계 추상화 수준에 있습니다. 파이썬과 루비에 대해 잘 모르겠습니다.
일반적으로 프로그래머 장난감 (복잡한 데이터 유형 등)이 많을수록 기계 언어에서 멀어지고 더 많은 번역을 수행해야합니다.
나는 여기 저기 있지만 기본 요점입니다.
업데이트 ——-이 게시물에 대한 자세한 설명이 있습니다.
답변
C의 비용 모델이 투명 하기 때문에 C가 빠르지는 않습니다 . C 프로그램이 느리면 많은 문을 실행함으로써 명백한 방식으로 느려집니다. C의 작업 비용과 비교하여 객체 (특히 리플렉션) 또는 문자열에 대한 높은 수준의 작업은 명확하지 않은 비용을 가질 수 있습니다.
일반적으로 C만큼 빠른 바이너리로 컴파일되는 두 가지 언어는 표준 ML ( MLton 컴파일러 사용) 및 Objective Caml 입니다. 벤치 마크 게임 을 확인하면 바이너리 트리와 같은 일부 벤치 마크의 경우 OCaml 버전이 C보다 빠릅니다 (MLton 항목을 찾지 못했습니다). 그러나 총격을 너무 심각하게 생각하지 마십시오. 그것은 게임이 말했듯이 결과는 종종 사람들이 코드를 조정하는 데 얼마나 많은 노력을 기울 였는지 반영합니다.
답변
C가 항상 빠르지는 않습니다.
C는 예를 들어 Modern Fortran보다 느립니다.
C는 종종 Java보다 느립니다. (특히 JIT 컴파일러가 코드를 살펴본 후)
C를 사용하면 포인터 앨리어싱이 가능해 지므로 일부 최적화가 불가능합니다. 특히 여러 실행 단위가있는 경우 데이터 가져 오기가 중단됩니다. 아야
포인터 산술이 작동한다고 가정하면 실제로 일부 CPU 제품군에서 부풀린 성능이 느려집니다 (특히 PIC!) 세그먼트 x86에서 큰 것을 빨아 들였습니다.
기본적으로 벡터 장치 또는 병렬화 컴파일러를 사용하면 C 악취와 최신 Fortran이 더 빨리 실행됩니다.
썽킹 (즉시 실행 파일 수정)과 같은 C 프로그래머 트릭으로 인해 CPU 프리 페치가 중단됩니다.
당신은 드리프트를 얻을?
그리고 우리의 좋은 친구 x86은 요즘 실제 CPU 아키텍처와 거의 관계가없는 명령어 세트를 실행합니다. 섀도우 레지스터,로드 저장소 최적화 프로그램은 모두 CPU에 있습니다. 따라서 C는 가상 금속에 가깝습니다. 진짜 금속, 인텔은 당신을 보지 못하게합니다. (역사적으로 VLIW CPU는 약간의 버스트이므로 아마도 그렇게 나쁘지 않을 것입니다.)
고성능 DSP (아마도 TI DSP?)에서 C로 프로그래밍하는 경우 컴파일러는 여러 병렬 실행 장치에서 C를 풀기 위해 까다로운 작업을 수행해야합니다. 이 경우 C는 금속에 가깝지 않지만 컴파일러에 가깝기 때문에 전체 프로그램 최적화가 수행됩니다. 기묘한.
마지막으로 일부 CPU (www.ajile.com)는 하드웨어에서 Java 바이트 코드를 실행합니다. C는 PITA가 해당 CPU에서 사용할 것입니다.