Capturing a time in milliseconds

前端 未结 7 1068
一生所求
一生所求 2020-11-30 07:11

The following piece of code is used to print the time in the logs:

#define PRINTTIME() struct tm  * tmptime;
time_t     tmpGetTime;
time(&tmpGetTime);
tm         


        
相关标签:
7条回答
  • 2020-11-30 07:22

    //C++11 Style:

    cout << "Time in Milliseconds =" << 
     chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now().time_since_epoch()).count() 
     << std::endl;
    
    cout << "Time in MicroSeconds=" << 
     chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now().time_since_epoch()).count() 
     << std::endl;
    
    0 讨论(0)
  • 2020-11-30 07:23

    You need a timer with a higher resolution in order to capture milliseconds. Try this:

    int cloc = clock();
    //do something that takes a few milliseconds
    cout << (clock() - cloc) << endl;
    

    This is of course dependent on your OS.

    0 讨论(0)
  • 2020-11-30 07:27

    New answer for old question using C++11 or C++14 and this free, open-source library:

    #include "tz.h"
    #include <iostream>
    
    int
    main()
    {
        using namespace date;
        using namespace std;
        using namespace std::chrono;
        auto now = make_zoned(current_zone(), floor<milliseconds>(system_clock::now()));
        cout << format("%e/%m/%Y %T", now) << '\n';
    }
    

    This just output for me:

    16/01/2017 15:34:32.167
    

    which is my current local date and time to millisecond precision. By eliminating the floor<milliseconds>() you will automatically get whatever precision your system_clock has.

    If you wanted the result as a UTC timestamp instead of a local timestamp, it is even easier:

        auto now = floor<milliseconds>(system_clock::now());
        cout << format("%e/%m/%Y %T", now) << '\n';
    

    And if you want a UTC timestamp and you aren't picky about the precision or the format, you can just:

    cout << system_clock::now() << '\n';
    

    which just output for me:

    2017-01-16 20:42:11.267245
    
    0 讨论(0)
  • 2020-11-30 07:30

    To have millisecond precision you have to use system calls specific to your OS.

    In Linux you can use

    #include <sys/time.h>
    
    timeval tv;
    gettimeofday(&tv, 0);
    // then convert struct tv to your needed ms precision
    

    timeval has microsecond precision.

    In Windows you can use:

    #include <Windows.h>
    
    SYSTEMTIME st;
    GetSystemTime(&st);
    // then convert st to your precision needs
    

    Of course you can use Boost to do that for you :)

    0 讨论(0)
  • 2020-11-30 07:31

    If you don't want to use any OS-specific code, you can use the ACE package which supplies the ACE_OS::gettimeofday function for most standard operating systems. For example:

    ACE_Time_Value startTime = ACE_OS::gettimeofday();
    
    do_something();
    
    ACE_Time_Value endTime = ACE_OS::gettimeofday();
    
    cout << "Elapsed time: " << (endTime.sec() - startTime.sec()) << " seconds and " << double(endTime.usec() - startTime.usec()) / 1000 << " milliseconds." << endl;
    

    This code will work regardless of your OS (as long as ACE supports this OS).

    0 讨论(0)
  • 2020-11-30 07:33

    The high resolution timers are usually gettimeofday on Linux style platforms and QueryPerformanceCounter on Windows.

    You should be aware that timing the duration of a single operation (even with a high resolution timer) will not yield accurate results. There are too many random factors at play. To get reliable timing information, you should run the task to be timed in a loop and compute the average task time. For this type of timing, the clock() function should be sufficient.

    0 讨论(0)
提交回复
热议问题