3
votes

I am wanting to print the running time of my functions. For some reason my timer always returns 0. Can anyone tell me why?

double RunningTime(clock_t time1, clock_t time2)
{
    double t=time1 - time2;
    double time = (t*1000)/CLOCKS_PER_SEC;
    return time;
}

int main()
{
     clock_t start_time = clock();


     // some code.....


    clock_t end_time = clock();

    std::cout << "Time elapsed: " << double(RunningTime(end_time, start_time)) << " ms";

    return 0;
}

I attempted to use gettimeofday and it still returned 0.

double get_time()
{
    struct timeval t;
    gettimeofday(&t, NULL);
    double d = t.tv_sec + (double) t.tv_usec/100000;
    return d;
}

int main()
{
        double time_start = get_time();

        //Some code......

        double time_end = get_time();

        std::cout << time_end - time_start;

    return 0;
}

Also tried using chrono and it gave me all kinds of build errors:

  • error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently
    experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
  • warning: 'auto' will change meaning in C++0x; please remove it
  • error: ISO C++ forbids declaration of 't1' with no type error: 'std::chrono' has not been declared
  • error: request for member 'count' in '(t2 - t1)', which is of non-class type 'int'

    int main() { auto t1 = std::chrono::high_resolution_clock::now();

                //Some code......
    
                auto t2 = std::chrono::high_resolution_clock::now();
    
                std::cout << "Time elapsed: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count() << " milliseconds\n";
    
            return 0;
        }
    
3
Consider using <chrono> if you want good resolution. You can easily specify milliseconds for the units instead of calculating it as well. - chris
On *nix systems, try gettimeofday() for high-resolution time (microseconds). - gavinb
If you don't have C++11, you can consider clock_gettime on Linux (using CLOCK_MONOTONIC_HR), or gethrtime for most other UNIX variants, and QueryPerformanceCounter on Windows. - jxh
@chris How would I implement <chrono> ? I googled it real quick but can't quickly figure out how to put it in my program without causing build errors. I used std::chrono::time_point<Clock> time_point - Jmh2013
@Fourthmeal70, I see, you need the -std=c++11 or -std=c++0x flag in your compiler options. - chris

3 Answers

4
votes

A timer tick is approximately equal to 1/CLOCKS_PER_SEC second, which is a millisecond resolution. To see a real (non-zero) number, you should either invoke a very long-time function or use another library with a higher time resolution facility:

  • new c++11x library chrono (use MSVS 2012)
  • boost::chrono (unfortunately, the library refers to a lot of others)
  • POSIX function gettimeofday, which gives you a 1 microsecond time resolution
0
votes

After lots of trial and error I went with gettimeofday. Here is my code that I finally got to work properly.

double get_time()
{
    struct timeval t;
    gettimeofday(&t, NULL);
    double d = t.tv_sec + (double) t.tv_usec/1000000;
    return d;
}

int main()
{
    double time_start = get_time();

    //Some code.........

    double time_end = get_time();

    std::cout << time_end - time_start;

    return 0;
}
0
votes

A solution I have been using lately uses C++11's lambda functionality to time any arbitrary function call or series of actions.

#include <ctime>
#include <iostream>
#include <functional>

void timeit(std::function<void()> func) {
    std::clock_t start = std::clock();

    func();

    int ms = (std::clock() - start) / (double) (CLOCKS_PER_SEC / 1000);

    std::cout << "Finished in " << ms << "ms" << std::endl;
}

int main() {
    timeit([] {
        for (int i = 0; i < 10; ++i) {
            std::cout << "i = " << i << std::endl;
        } 
    });

    return 0;
}