[C#] 고성능 타이머의 실현

2428 단어 C#타이머
때때로 프로그램의 운행 시간을 정확하게 계산해야 하는데, Windows API 방법인 GetTickCount ()는 시스템이 시작된 후의 밀리초 수를 되돌려줍니다. 정확하지 않습니다.
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;

이 글은'꽃이 피고 꽃이 떨어진다'는 블로그에서 나온 것이니 전재를 사절합니다!

좋은 웹페이지 즐겨찾기