Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000000; ++i)
{
}
sw.Stop();
Console.WriteLine($"Elapsed: {sw.Elapsed}");
Console.WriteLine($"ElapsedMilliseconds: {sw.ElapsedMilliseconds}");
Console.WriteLine($"ElapsedTicks: {sw.ElapsedTicks}");
원리
Stopwatch는 기본 타이머 메커니즘에서 타이머 Tick을 카운트하여 경과 시간을 측정한다.
Tick은 Stopwatch 타이머가 측정할 수 있는 가장 작은 시간 단위이며, 내부 시스템 시간을 측정하는 임의의 시간 단위이다.
ElapsedTicks는 경과된 틱 수를 나타낸다. 이를 Frequency 필드로 나눠 초 단위로 변환한다.
즉, Frequency는 초당 몇 번의 Tick이 흐르는지를 나타내고, 이는 타이머 정밀도와 resolution 나타낸다.
(Stopwatch의 Tick은 DateTime의 Tick과는 다르다.)
publicstaticreadonlylong Frequency = QueryPerformanceFrequency();
publicstaticreadonlybool IsHighResolution = true;
privatestaticunsafelongQueryPerformanceFrequency()
{
long resolution;
Interop.BOOL result = Interop.Kernel32.QueryPerformanceFrequency(&resolution);
// The P/Invoke is documented to never fail on Windows XP or later
Debug.Assert(result != Interop.BOOL.FALSE);
return resolution;
}
위는 Windows 환경에서의 Frequency이다.
설치된 하드웨어 및 운영 체제가 high resolution 성능 카운터를 지원하는 경우 Frequency 값은 해당 카운터의 주파수를 반영하고, 그렇지 않으면 시스템 타이머 주파수를 기준으로 한다.