그런 샘플에서 중요한 것은 없습니다. 단순한 get
에 들어있는 JIT의 가능성은 매우 낮습니다. get
이 인라인되지 않은 경우에도 추가 함수 호출이 매우 단순한 코드 외부에서 성능 병목 현상을 일으키지는 않습니다.
무슨 뜻인지 보여주기 위해 릴리스 모드에서 다음을 실행했습니다 (디버그 상태로두면 다르게 작동합니다).
private int Length { get; set; }
private int _length;
void Run()
{
Length = int.MaxValue;
_length = int.MaxValue;
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < Length; i++)
{
}
watch.Stop();
Console.WriteLine("Elapsed: {0}ms", watch.ElapsedMilliseconds);
watch.Restart();
for (int i = 0; i < _length; i++)
{
}
watch.Stop();
Console.WriteLine("Elapsed: {0}ms", watch.ElapsedMilliseconds);
}
다음과 같은 평균값이 있습니다. 속성 : 743 ms, 변수 : 740 ms. 그 차이는 아마도 시도 횟수가 적어서 내 컴퓨터에서 다른 일이 일어나기 때문일 수 있습니다.
이제 특성을 통해 인라인을 해제하면 속성에 4577 ms, 변수에 775 ms의 시간 차이가 발생합니다. 이제 막 큰 차이 (6 배 많은 시간 합계)가 들리지만 내 루프 조건 인 20 억 반복을 기억하십시오. 즉, 차이는 작동 당 2 ns와 같습니다. 즉, 약 4 클록 주기로, 가장 극단적 인 성능 시나리오를 제외하고는 충분히 걱정할 필요가 없습니다.
속성으로 인해 성능이 저하된다는 것을 측정하셨습니까? 'get '도구는 일반적으로 JIT 컴파일러에 의해 인라이닝되기에 충분히 간단하므로 필드와 속성간에 성능 차이는 없습니다. – dtb
작업 : for 루프와 함께 바이트 *를 사용하여 메모리를 지 웁니다. 개체에서 변수 사용 = X ms. 속성 사용 = 2 * X ms. 그래서 재산은 훨씬 더 느립니다. 객체 변수에서 Length를 로컬 변수에 복사하면 또 다른 10 %의 속도가 나타납니다. 그래서 마침내 Length 속성을 사용하고 각 for 루프 앞에 로컬 변수에 값을 복사합니다. 물론 메모리를 지우려면 long *을 사용할 때 길이를 로컬 변수에 복사하는 것이 더 유용 할 것입니다. 그래서 나는 그것을 해결했다. – zgnilec