2014-09-29 2 views
1

실행 시간을 계산하기 위해 코드를 생성했습니다.힙에서 실행 시간 - 스택

효과가 있습니다. 그러나 나는 설명 할 수 없었다 : 힙과 스택의 변수의 차이는 무엇인가?

나는 "실행 시간"에 대해 이야기하고 있습니다.

Heap : a, b, c에 3 개의 변수를 만들었습니다.

스택의 3 가지 변수 : aa, bb, cc.

내 코드 :

class Program 
{ 
    private int a = 1; 
    private int b = 2; 
    private int c = 0; 

    static void Main() 
    { 
     int aa = 1; 
     int bb = 2; 
     int cc = 0; 

     var sw = new Stopwatch(); 
     var _sw = new Stopwatch(); 

     Program pro = new Program(); 

     for (int k = 0; k < 10; k++) 
     { 
      sw.Start(); 
      for (int i = 0; i < 500000000; i++) 
      { 
       pro.c += pro.a + pro.b; 
      } 
      sw.Stop(); 

      Console.WriteLine("Heap:"); 
      Console.WriteLine("TotalMiliseconds: {0}", sw.Elapsed.TotalMilliseconds.ToString()); 
      Console.WriteLine("__________________________________"); 
      sw.Reset(); 

      _sw.Start(); 
      for (int j = 0; j < 500000000; j++) 
      { 
       cc += aa + bb; 
      } 
      _sw.Stop(); 

      Console.WriteLine("Stack:"); 
      Console.WriteLine("TotalMiliseconds: {0}", _sw.Elapsed.TotalMilliseconds.ToString()); 
      Console.WriteLine("__________________________________"); 

      _sw.Reset(); 
     } 
     Console.ReadKey(); 
    } 

}

다음

내 질문은 : 힙의 실행 시간 스택보다 항상 빠른 이유를 말씀해 주시겠습니까?

감사합니다.

+0

관련 항목 : [스택 및 힙은 무엇이며 어디에 있습니까?] (http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap) –

+1

소스에 따르면 힙은 스택보다 느리며 케빈이 묻는 것과는 대조적입니다. 힙이 더 빠른 경우에 대한 정보는 제공하지 않습니다. – Adimeus

+0

코드를 실행할 때 '힙'루프는 항상 약 10 % 느리게 실행됩니다. – Rotem

답변

-3

두 변수 세트가 모두 값 유형이므로 스택에 스택 세트가 할당되므로 스택 액세스와 힙 액세스를 비교하지 않는 것이 좋습니다. 여기를 참조하십시오 : http://msdn.microsoft.com/en-us/library/4d43ts61(v=vs.90).aspx

+1

값 유형/참조 유형 이분법이 실제로 여기에 나타나지 않습니다. 이와 관련된 유일한 측면은 값 유형 필드 인'a','b' 및'c'가'Program' 인스턴스에 "임베디드"됩니다. 즉, 다른 곳에 위치하는 대신 내부에 저장됩니다. 'Program' 인스턴스 내부에서 참조됩니다. OP가'새로운 '프로그램 인스턴스이기 때문에 "힙"에 착륙 할 것이라고 추측 할 수 있습니다. 그리고 지역 변수가 항상 "스택"에 있다고 추측 할 수 있습니다. 하지만 그것은 단지 추측입니다. – stakx

+1

개체가 "스택"또는 "힙"에 놓여 있는지 여부와 이러한 구성이 첫 번째 위치에 있는지 여부는 대부분 런타임 환경 (CLR)에 의한 구현 세부 사항과 소스 코드를 보거나 강제적으로 살펴볼 수 있습니다. (즉, CLR은 고정 된 규칙에 따라 작동한다는 것을 인정하기 때문에 새로운 인스턴스는 실제로 힙에서 끝나고 레지스터 나 스택의 로컬 변수로 끝납니다. – stakx

+0

@stakx 올바른 경우, 그러면 주석으로 설명하는 대신 해답으로 제시해야합니다. –