C \ # 의 고성능 타이머 (번역)

3577 단어 threadC++cwindowsC#
[오스트리아] Daniel Strigl 저  Ricky 번역 출처:http://www.codeproject.com [size = large;] 소개 [/ size] 정확 한 시간 계량 방법 은 일부 응용 프로그램 에서 매우 중요 하 다.자주 사용 하 는 윈도 API 방법 GetTickCount () 는 시스템 시작 후 지나 간 밀리초 수 를 되 돌려 줍 니 다.다른 한편, GetTickCount () 함 수 는 1ms 의 분별 정밀도 만 있어 정확 하지 않다.그러므로 우 리 는 시간 을 정확하게 측정 하 는 방법 을 따로 찾 아야 한다.Win 32 API 는 Query PerformanceCounter () 와 Query PerformanceFrequency () 방법 을 사용 하여 높 은 정밀도 의 시간 을 지원 합 니 다.이 방법 들 은 GetTickCount () 와 같은 '표준' 밀리초 정밀도 의 시간 계산 방법 보다 훨씬 높 은 정밀도 가 있다.다른 한편, C \ # 에서 '비 위탁 관리' API 함 수 를 사용 하면 비용 이 어느 정도 들 지만, 조금도 정확 하지 않 은 GetTickCount () API 함 수 를 사용 하 는 것 보 다 는 훨씬 낫다.첫 번 째 함수 Query PerformanceCounter () 는 임의의 시간 고정 밀 계수기 의 실제 값 을 조회 합 니 다.두 번 째 함수 Query Performance Frequency () 는 고정 밀 계수기 의 초당 계수 값 을 되 돌려 줍 니 다.어떤 코드 세그먼트 가 겪 은 시간 을 얻 기 위해 서 는 코드 세그먼트 가 시작 되 기 전과 끝 난 후 이 두 시간 동안 의 높 은 정밀도 카운터 의 실제 값 을 얻어 야 합 니 다.이 두 값 의 차 이 는 코드 세그먼트 가 실 행 된 시간 을 지적 했다.그리고 차 이 를 초당 계수 값 (고밀도 타이머 주파수) 으로 나 누 면 지나 간 시간 을 계산 할 수 있다.duration = (stop - start) / frequency 경과 시간 = (정지 시간 - 시작 시간) / 주파 수 는 Query PerformanceCounter 와 Query PerformanceFrequency 에 대한 더 많은 정보 가 필요 합 니 다. MSDN 문 서 를 참조 하 십시오.[size = large;] 코드 [/ size] 아래 클래스 는 Query PerformanceCounter () 와 Query PerformanceFrequency () API 함수 의 기능 을 실현 합 니 다.
using System; 
using System.Runtime.InteropServices; 
using System.ComponentModel; 
using System.Threading; 

namespace Win32 
{ 
    internal 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 의 인 스 턴 스 를 만 든 다음 Start () 를 호출 하여 시간 을 재 고 Stop () 은 시간 을 멈 춰 야 합 니 다.지나 간 시간 을 얻 으 려 면 Duration () 함 수 를 호출 하면 됩 니 다.아래 의 예 를 참고 하 시 오.
HiPerfTimer pt = new HiPerfTimer();     //      HiPerfTimer    
pt.Start();                             //       
Console.WriteLine("Test
"); // pt.Stop(); // Console.WriteLine("Duration: {0} sec
", pt.Duration); //

 테스트 결 과 는 여러분 이 직접 해 보 셨 어 요.

좋은 웹페이지 즐겨찾기