아래의 두 접근 자 함수 사이의 속도 차이를 측정 한 테스트를 실행했으며 예상 시간의 차이가 예상보다 컸습니다. 나는 속기 구현이 좀 더 빠를 것이라는 느낌을 받았기 때문에 그것을 시험하고 싶었다.속기 접근 자 기능이 일반 카운터보다 빠릅니다.
각 클래스에 대해 Get 함수를 호출하기 위해 필요한 총 총 시간 (초)을 10 억 회 반복했습니다.
using System;
using System.Diagnostics;
class SimpleGet {
int value;
public int Get() {
return value;
}
}
class ShorthandGet {
int value;
public int Get() => value;
}
class Program {
static void Main() {
const int Iterations = 1000000000;
Stopwatch sw = new Stopwatch();
sw.Start();
{
int n; SimpleGet sg = new SimpleGet();
for (int i = 0; i < Iterations; i++) {
n = sg.Get();
}
}
sw.Stop();
Console.WriteLine("SimpleGet: " + sw.Elapsed.TotalSeconds);
sw.Reset();
sw.Start();
{
int n; ShorthandGet shg = new ShorthandGet();
for (int i = 0; i < Iterations; i++) {
n = shg.Get();
}
}
sw.Stop();
Console.WriteLine("ShorthandGet: " + sw.Elapsed.TotalSeconds);
Console.ReadLine();
}
}
결과 :
// 1 billion iterations
SimpleGet: 11.8484244
ShorthandGet: 4.3218568
속도의 차이가 크다. 내가 볼 수있는 유일한 차이점은 일반 함수에는 대괄호가 있고 따라서 함수 호출에 새로운 범위가 작성된다는 것입니다. 범위 안에 새로운 변수가 없기 때문에 이론적으로 "무시"해서는 안되는가? 누군가 정규 함수가 다른 함수와 동일한 수준으로 최적화되지 않은 이유를 설명 할 수 있습니까?
편집 나는 특성을 가진 동일한 시나리오를 테스트 : Value { get { return value; } }
및 Value => value;
와의 시간 차이를 우리는 각각의 기능을 시간의 차이에 매우 가까이있어. 나는 그 원인이 같다고 생각한다.
디버거를 연결하지 않고 최적화 된 빌드 (즉, 출시하지 않음 디버그)에서이 벤치 마크를 실행 했습니까? –
예, 디버그 모드에있을 때와 동일한 결과가 표시됩니다. 그러나 Release로 변경하면 두 루프가 약 2.3 초가됩니다. – Jonesopolis
네 말이 맞아, 그건 내 부분에서 무지이었다. 내가 릴리스 디버거없이 빌드를 시도, 그들은 거의 같았습니다. – Dave