Click here to Skip to main content
11,571,471 members (74,968 online)
Click here to Skip to main content

Tagged as

Precise duration measurement

, 27 Dec 1999 98.6K 2.4K 43
Rate this:
Please Sign up or sign in to vote.
A simple class that provides high precision timing.
  • Download demo project - 5 Kb
  • Download source files - 1 Kb
  • <!-- Article Starts -->

    Here is a simple class used to measure the duration of functions or code parts (from some microseconds to milliseconds) using the Windows high precision timer.

    This class is very easy to use. The following code measure the duration of the Foo function:

        CDuration timer;
    
        timer.Start();
        Foo();
        timer.Stop();
    
        cout << "Foo duration: " << timer.GetDuration()/1000.0 << " milliseconds" << endl;
    

    The GetDuration() method returns the number of microseconds between calls to Start() and Stop(). This value depends on the precision of the internal timer. In a multitasking operating system like Windows, it is difficult to make very accurate duration measurement. Thus, measurement less than a few milliseconds will be correct, but longer measurement could have a difference of a tenth of a millisecond or more because of tasks switching.

    The constructor implements a calibration procedure so the following code will return 0 milliseconds:

        CDuration dur;
    
        dur.Start();
        dur.Stop();
    
        cout << "Zero duration: " << dur.GetDuration()/1000.0 << " milliseconds" << endl;
    

    If you really need no task switching during a long time, you could increment the process and thread priority in the Start() method and decrement it in Stop() .

    License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here

    Share

    About the Author

    Laurent Guinnard
    Switzerland Switzerland
    No Biography provided

    You may also be interested in...

    Comments and Discussions

     
    Questionlicense Pin
    JohnWallis4210-Jun-09 17:40
    memberJohnWallis4210-Jun-09 17:40 
    AnswerRe: license Pin
    Laurent.Guinnard1-Nov-09 7:01
    memberLaurent.Guinnard1-Nov-09 7:01 
    Questionhow come it wont compile? Pin
    chefmannyd16-May-09 8:05
    memberchefmannyd16-May-09 8:05 
    AnswerRe: how come it wont compile? Pin
    Dave Cross20-Jul-09 0:49
    memberDave Cross20-Jul-09 0:49 
    QuestionCan I write my own profilling code Pin
    aamerqureshi12-Mar-07 1:02
    memberaamerqureshi12-Mar-07 1:02 
    GeneralTerrific.. but could use a few small functions Pin
    hannahb3-Aug-06 6:14
    memberhannahb3-Aug-06 6:14 
    Questionseconds or milliseconds ? Pin
    Stlan25-Apr-05 3:55
    memberStlan25-Apr-05 3:55 
    AnswerRe: seconds or milliseconds ? Pin
    Stlan25-Apr-05 3:56
    memberStlan25-Apr-05 3:56 
    GeneralExcellent Pin
    Simon Hughes2-Jun-04 1:56
    memberSimon Hughes2-Jun-04 1:56 
    GeneralThe best! Pin
    Dlt7520-May-04 20:21
    memberDlt7520-May-04 20:21 
    GeneralAccurate timing Pin
    Bernhard Hofmann9-Sep-03 21:59
    memberBernhard Hofmann9-Sep-03 21:59 
    Hi

    A long time ago (Feb. 1999), I read an article by Chih-Hao Tsai of the University of Illinois at Urbana-Champaign.

    He was using Windows 95, so the high res timer wasn't available. Also, if anyone needs a precise timer on an older OS, they might be interested in the following. He used the multi-media timer (in winmm.lib) to get a millisecond accurate timer.

    His article is unfortunately no longer where it once was (http://casper.beckman.uiuc.edu/~c-tsai4/cogsci/millisecond.html). His summary was as follows:

    "Virtually all cognitive psychology experiments require a millisecond resolution timing routine. In the good old MS-DOS days, it was easy to achieve this by increasing the frequency of hardware interrupt IRQ0 (int 8h), at the cost of increased instability of the whole system. Today, most people have already moved from MS-DOS to Windows 95 operating system. Since Windows 95 a such a complex system, in general a programmer cannot (or is not allowed to) intrude into lower levels of the system.

    In fact, both the standard C run-time library and the Win32 API provide some timing functions. But we do not know how accurate they are. Two run-time library functions and two Win32 API functions from Microsoft Visual C++ Version 4.0 were tested on a Windows 95 machine with a standardized procedure for their quality (in terms of the resolution they can achieve). It was found that the two run-time library functions were basically at the same precision level: 18.2 Hz (resolution = 55 ms). The two Win32 API functions performed better than the run-time library functions, but only one of them reached near-millisecond resolution. It was concluded that only the Multimedia Timer is qualified to be used in psychological experiments.
    "

    I still have the code samples he wrote to test the timers as well if anyone's interested.
    GeneralCalling Start() Causes a Thread Switch Pin
    MikeAThon20-Feb-03 15:08
    memberMikeAThon20-Feb-03 15:08 
    GeneralRe: Calling Start() Causes a Thread Switch Pin
    peterchen25-Apr-05 6:08
    memberpeterchen25-Apr-05 6:08 
    GeneralRe: Calling Start() Causes a Thread Switch Pin
    Toby Opferman15-Aug-06 16:39
    memberToby Opferman15-Aug-06 16:39 
    General5/5 Pin
    Ralph Wetzel8-Jan-03 10:42
    memberRalph Wetzel8-Jan-03 10:42 
    GeneralExcellent! Pin
    Nitron12-Nov-02 8:16
    memberNitron12-Nov-02 8:16 
    GeneralSimple and concise I like it. Pin
    Anonymous4-Mar-02 9:46
    memberAnonymous4-Mar-02 9:46 

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

    | Advertise | Privacy | Terms of Use | Mobile
    Web04 | 2.8.150624.2 | Last Updated 28 Dec 1999
    Article Copyright 1999 by Laurent Guinnard
    Everything else Copyright © CodeProject, 1999-2015
    Layout: fixed | fluid