[C#] 고성능 타이머의 실현
Win32 API는 QueryPerformanceCounter()와 QueryPerformanceFrequency() 방법을 사용하여 고정밀 타이머를 지원합니다.이러한 방법은 GetTickCount () 와 같은 표준 밀리초 정밀도보다 훨씬 높다.다른 한편, C#에서'비위탁관리'API 함수를 사용하면 일정한 비용이 들지만, 조금도 정확하지 않은 GetTickCount() API 함수를 사용하는 것보다 훨씬 낫다.
첫 번째 함수QueryPerformanceCounter()는 임의의 시간 고정밀 카운터의 실제 값을 조회합니다.두 번째 함수QueryPerformanceFrequency()는 고정밀 카운터의 초당 계수 값을 반환합니다.어떤 코드 세그먼트가 겪는 시간을 얻기 위해서는 코드 세그먼트가 시작되기 전과 끝난 후의 두 시간 동안의 고정밀 계수기의 실제 값을 얻어야 한다.이 두 값의 차이는 코드 세그먼트가 실행된 시간을 가리킨다.그리고 차를 초당 계수치(고정밀 타이머 주파수)로 나누면 지나간 시간을 계산할 수 있다.duration = (stop - start)/frequency 경과 시간 = (정지 시간 - 시작 시간)/주파수
C# 구현 코드
public class HiPerfTimer
{
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceCounter(
out long lpPerformanceCount);
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(
out long lpFrequency);
private long startTime, stopTime;
private long freq;
//
public HiPerfTimer()
{
startTime = 0;
stopTime = 0;
if (QueryPerformanceFrequency(out freq) == false)
{
//
throw new Win32Exception();
}
}
//
public void Start()
{
//
Thread.Sleep(0);
QueryPerformanceCounter(out startTime);
}
//
public void Stop()
{
QueryPerformanceCounter(out stopTime);
}
// ( : )
public double Duration
{
get
{
return (double)(stopTime - startTime) / (double)freq;
}
}
}
호출 방법:
HiPerfTimer pt = new HiPerfTimer(); // HiPerfTimer
pt.Start(); //
Console.WriteLine("Test
"); //
pt.Stop(); //
Console.WriteLine("Duration: {0} sec
",pt.Duration); //
참고: 다음과 같은 네임스페이스를 추가해야 합니다.
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Threading;
이 글은'꽃이 피고 꽃이 떨어진다'는 블로그에서 나온 것이니 전재를 사절합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.