2010-04-20 1 views
4

저는 C++과 C#의 속도 차이가 JIT 컴파일러에 의해 받아 들여지는 바이트 코드로 컴파일되는 것에 대해 생각하고있었습니다 (정확합니까?). C#은 모든 검사를 수행합니다.작은 집약적 인 작업을 위해 C#의 성능을 어느 정도로 얻을 수 있습니까?

나는이 옵션을 컴파일 옵션에서 모두 해제 할 수 있으며, 안전하지 않은 코드는 공용 언어 런타임에서 확인할 수 없기 때문에 unsafe 키워드를 사용하는 것이 가능하다는 것을 알고 있습니다.

따라서 간단한 콘솔 응용 프로그램을 두 언어로 작성하면 상상의 동전을 무한 횟수 뒤집어서 10,000 회 정도의 반복 결과를 화면에 표시합니다. 속도 차이는 얼마나 될까요? 이것은 매우 간단한 프로그램이기 때문에 이것을 선택했습니다.

이걸 테스트하고 싶지만 C++을 모르거나 컴파일 할 수있는 도구가 있습니다. 이것은 비록 내 C# 버전입니다 :

static void Main(string[] args) 
{ 
    unsafe 
    { 
     Random rnd = new Random(); 
     int heads = 0, tails = 0; 
     while (true) 
     { 
      if (rnd.NextDouble() > 0.5) 
       heads++; 
      else 
       tails++; 

      if ((heads + tails) % 1000000 == 0) 
       Console.WriteLine("Heads: {0} Tails: {1}", heads, tails); 
     } 
    } 
} 

충분히 의도적으로 보증 "안전하지 않은"또는 오버 플로우와 같은 컴파일 옵션 중 일부가없는 DLL을에 코드 섹션을 컴파일 할 수있는 차이가 사용할 수 확인? 또는 다른 방법으로 C++에서 섹션을 컴파일하는 것이 유익 할 것입니까? 나는 interop 속도가 그때에도 작용할 것이라 확신합니다.

  • 합니까 C#을 안전하지 않은 코드를 사용에서 성능 향상이있다 :

    주체성을 방지하기 위해, I는이 질문의 특정 부분을 반복?

  • 오버플로 검사를 비활성화하는 것과 같은 컴파일 옵션이 성능을 향상시키고 안전하지 않은 코드에 영향을 줍니까?
  • 위의 프로그램이 C++에서 더 빠르거나 무시할 수있을 정도로 다를까요?
  • C++와 같은 언어로 긴 집약적 인 업무 처리를 컴파일하거나 보너스로/unsafe를 사용하는 것이 가치가 있습니까? 덜 주관적으로, 이렇게하면 집중적 인 작업을 더 빨리 완료 할 수 있습니까?
+2

이 아주 나쁜 예 - 당신은 난수 생성기의 성능을 테스트하고 Console.WriteLine. – Marek

+4

최대 성능을 얻기위한 ** 유일한 ** 방법은 ** 좋은 ** 코드를 작성하는 것입니다. 당신이 C# 또는 C++로 쓰든 상관 없습니다. 어떤 언어도 "아, 그리고이 코드를 X보다 더 효율적으로 컴파일하는 것은 금지되어 있습니다"라는 규칙으로 정의되어 있지 않습니다. C# 및 C++ 컴파일러는 가능한 빨리 코드를 만들 수있는 모든 작업을 수행합니다 *. 그러나 예, 많은 일반적인 경우 C#은 C++만큼 빠르다. 때로는 더 빠른 코드가 될 수도 있습니다. 때로는 그렇지 않습니다. 언어에 대한 걱정이 적어지고 작성중인 코드에 대해 더 많이 알 수 있습니다. – jalf

+0

@ jalf : C# 응용 프로그램 대 C++ 응용 프로그램의 실행 속도가 더 빠르다는 예가 있습니까? C#이 C++만큼 빠르거나 C++보다 빠르다고 보는 방법은 간단한 데이터 형식 만 사용하는 것입니다 ... – Alerty

답변

2

이 예제는 두 프로그래밍 언어의 실생활을 보여주지 못하기 때문에 결함이 있습니다. 간단한 데이터 유형을 사용하여 언어의 속도를 측정해도 흥미로운 것은 없습니다. 대신 C++로 템플릿 클래스를 생성하고 클래스 제네릭을 위해 C#에서 가능했던 것과 비교해 보시기 바랍니다.결국 오브젝트가 중요한 결과를 가져오고 C++이 C#보다 빠르다는 것을 알게 될 것입니다. 더 낮은 수준의 프로그래밍 언어를 C#과 비교한다는 것은 말할 필요도 없습니다.

안전하지 않은 코드를 사용하는 C#의 성능이 에서 향상 되었습니까?

예, 안전성이있는 코드 만 작성하는 것은 좋지 않습니다. 그 이유는 다음과 같습니다. 안전하지 않은 컨텍스트를 사용하여 작성된 코드는 안전하다고 확인할 수 없으므로 코드가 완전히 신뢰되는 경우에만 실행됩니다. 즉, 신뢰할 수없는 환경에서는 안전하지 않은 코드를 실행할 수 없습니다. 예를 들어, 안전하지 않은 코드는 인터넷에서 직접 실행할 수 없습니다. http://msdn.microsoft.com/en-us/library/aa288474(VS.71).aspx

프로그램이 위의 빠른 C++ 또는 negligably 다른에있을 것입니다?

예 프로그램이 C++에서 약간 더 빠릅니다. C++은 프로그래밍 언어가 낮으며 알고리즘 라이브러리 (random_shuffle이 마음에 듭니다)를 사용하기 시작하면 더 빠릅니다.

IT는 보너스 안전하지 않은/C++와 같은 언어 에 오래 집중 수-재정 업무를 컴파일 또는 사용 가치가? 덜 주관적으로, 나는 집중적 인 작업을 더 빨리 완료 할 수 있습니까? 이렇게하면됩니까?

그것은 프로젝트에 따라

...

1

속도가 최대 100 % 이상인 경우 작업에 많이 달려 있다고 간단히 말하면됩니다.

이상 100 % - 방금 시간에 컴파일러가 프로세서를 알고, 나는 당신이 실제로 하드웨어 플랫폼에 최적화 의심 때문에 예,)

없음 SSE는 행렬 연산을 할 경우에 문제가 있습니다.

여러 가지 배열이있는 일부 항목 (이미지 조작) 배열 테스트는 사용자를 죽이지 만 포인터를 무시하므로 포인터가 작동합니다 (즉, 안전하지 않은 코드).

오버플로 검사와 관련하여 -주의하십시오. 마찬가지로 : C++에서는 동일한 가능성이 있습니다. 오버 플로우 검사가 필요한 경우에는 성능 문제가 없습니다.)

저는 대부분의 경우 C++을 개인적으로 신경 쓰지 않을 것입니다. 부분적으로 예, 특히 SSE 혜택을 누릴 수있는 경우 :

따라서 결국 계산에 따라 NATURE에 따라 많은 영향을받습니다.

+0

-1 ..C++에서는 가비지 수집을 처리 할 필요가 없습니다. C#은 백그라운드에서 더 많은 일을 수행 한 다음 C++을 수행합니다. C++로 더 많은 최적화를 할 수 있습니다. C#은 더 높은 수준의 언어이므로 느려집니다. – Luke101