속성 및 자동 속성에 대한 몇 가지 질문과 대답을 확인한 후 컴파일러에서이를 나타내는 방법을 살펴 보았습니다.자동 속성은 어떻게 컴파일됩니까?
내가 이해 한 것으로부터, 자동 속성은 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라는 결론을 내 렸습니다. 이것이 올바른 결론입니까? 마지막으로 디버거가 연결되었을 때 필드가 속성보다 빠 른 이유는 무엇입니까?
C#을 사용할 때 실제로 두 가지 컴파일 단계가 있습니다 (.NET 네이티브와 같은 것을 사용하지 않는다고 가정). "컴파일 타임"에서 MSIL을 출력하는 C# 컴파일러와 런타임에 기계 코드를 생성하는 JIT 컴파일러. JIT는 사용자가 추측 한 인라인 최적화를 수행합니다. 또한 디버깅 경험을 향상시키기 위해 디버거가 연결될 때 다른 차선의 기계 코드를 생성합니다. –
감사합니다 @mikez, 이것은 copletly 내 질문에 대답하지 않지만 그것은 귀중한 정보입니다 – meJustAndrew