2016-07-11 5 views
0

속성 및 자동 속성에 대한 몇 가지 질문과 대답을 확인한 후 컴파일러에서이를 나타내는 방법을 살펴 보았습니다.자동 속성은 어떻게 컴파일됩니까?

내가 이해 한 것으로부터, 자동 속성은 getter와 setter의 두 가지 메소드로 필드로 표현됩니다. 이 경우 필드를 사용하면 해당 필드에 액세스하는 코드가 메서드에 대한 suplimentar 호출을 피하기 때문에 속성에 액세스하는 코드보다 빠릅니다. 이 이론을 증명하기 위해 나는 다음과 같은 코드를 작성되었고, 그것이 어떻게 보이는지 실례하십시오

그것은 10M 시간 필드를 호출 구성
public class A 
{ 
    public int Prop { get; set; } 
    public int Field; 

    public A() 
    { 
     Prop = 1; 
     Field = 1; 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     List<long> propertyExecutionTimes = new List<long>(); 
     List<long> fieldExecutionTimes = new List<long>(); 

     A a = new A(); 
     int aux; 
     for (int j = 0; j < 100; j++) 
     { 
      var watch = System.Diagnostics.Stopwatch.StartNew(); 
      for (int i = 0; i < 10000000; i++) 
      { 
       aux = a.Prop; 
       a.Prop = aux; 
      } 
      watch.Stop(); 

      propertyExecutionTimes.Add(watch.ElapsedMilliseconds); 

      watch = System.Diagnostics.Stopwatch.StartNew(); 
      for (int i = 0; i < 10000000; i++) 
      { 
       aux = a.Field; 
       a.Field = aux; 
      } 
      watch.Stop(); 

      fieldExecutionTimes.Add(watch.ElapsedMilliseconds); 
     } 
     Console.WriteLine("Property best time: " + propertyExecutionTimes.OrderBy(x => x).First()); 
     Console.WriteLine("Field best time: " + fieldExecutionTimes.OrderBy(x => x).First()); 

     Console.ReadKey(); 
    } 
} 

, 속성 모든게 10 회 10M 시간을 호출 대하고, 각 테스트에서 가장 낮은 값이 선택됩니다. VS2012 릴리스 버전의 결과는 다음과 같습니다.

Property best time: 96 
Field best time: 45 

예상대로 필드에 대한 결과는 속성보다 훨씬 낫습니다.

그러나이 후 나는 (단순히 .exe 파일을 실행) 디버거하지 않고 프로그램을 runned하고 나를 위해 깜짝 선물로, 시간은 모두 사용하여 필드 비슷하고 같은 속성 :

Property best time: 20 
Field best time: 20 

이 경우 속성과 필드를 사용하는 것 사이의 차이점은 none이었습니다. 따라서이 경우에는 같은 것으로 컴파일되거나 속성의 메서드가 C++의 inline 메서드와 비슷한 것으로 변환됩니다. 을 존중하는 몇 가지 변화와 속성에 대한

private int _field; 
public int Get() { return _field; } 
public void Set(int value) { _field = value; } 

유사 시험이 : 이것은 제가 재산에 copared 작업하는 방법을 실제 getter 및 setter를 참조해야한다고 생각, 그래서 getter 및 setter 쌍을 추가했다 같은 동작 :

Property best time: 96 
Methods best time: 96 
디버거와

과 :

aux = a.Get(); 
a.Set(aux); 

나에게이 출력을 준
Property best time: 20 
Methods best time: 20 

디버거를 사용하지 않습니다. 이 값들은 동일하므로 자동 속성은 필드와 마찬가지로 컴파일되는 getter 및 setter라는 결론을 내 렸습니다. 이것이 올바른 결론입니까? 마지막으로 디버거가 연결되었을 때 필드가 속성보다 빠 른 이유는 무엇입니까?

+1

C#을 사용할 때 실제로 두 가지 컴파일 단계가 있습니다 (.NET 네이티브와 같은 것을 사용하지 않는다고 가정). "컴파일 타임"에서 MSIL을 출력하는 C# 컴파일러와 런타임에 기계 코드를 생성하는 JIT 컴파일러. JIT는 사용자가 추측 한 인라인 최적화를 수행합니다. 또한 디버깅 경험을 향상시키기 위해 디버거가 연결될 때 다른 차선의 기계 코드를 생성합니다. –

+0

감사합니다 @mikez, 이것은 copletly 내 질문에 대답하지 않지만 그것은 귀중한 정보입니다 – meJustAndrew

답변

1

이 값은 동일하므로 자동 속성은 필드와 마찬가지로 컴파일되는 getter 및 setter입니다.

예, 자동 등록 정보는 필드로 구현되고 get 및 선택적으로 해당 필드의 접근 자로 구현됩니다.

올바른 결론입니까?

잘못된 이유 때문입니다. :) 자동 속성이 어떻게 구현되는지 정확히 보려면 ​​타이밍에 의존하지 말고 프로그램이나 라이브러리를 만들고 MSIL 디스어셈블러에서 엽니 다. 앞서 보았 듯이 타이밍 결과는 오해의 소지가 있습니다.

그리고 마지막으로 왜 필드가 디버거가 연결되었을 때 속성보다 빠릅니까?

인라인 같은 것들에 대한 훨씬 적은 기회가 인라인가 더 어려워 등이 주로 그 속성 접근이 빨리 만들어 인라인 것, 브레이크 포인트를 설정 편집 - 및 - 계속 지원 할 수 있기 때문에,있다, 디버깅 할 때 직접 필드 액세스로.

+0

나는 지금까지 어떤 이진 파일을 분해하지 않았다는 것을 인정해야한다. 그래서 나는 어느 정도 시간이 걸렸다. 첫째로 나는 릴리스 모드에서 dll 빌드를 분해하고 있었기 때문에 많은 것을 보여주지 못했지만 Debug에서 버전을 시도했을 때 놀랐습니다! 나는 전체 구조가 어떻게 잡혔는지를 볼 수 있었다. 대답 해 주셔서 감사합니다. 좀 더 일하게하겠습니다.하지만 가치가있었습니다. 좋은 하루 되세요! – meJustAndrew

관련 문제