Search code examples
c++multithreadingtimemeasure

Measuring execution time when using threads


I would like to measure the execution time of some code. The code starts in the main() function and finishes in an event handler.

I have a C++11 code that looks like this:

#include <iostream>

#include <time.h>

...

volatile clock_t t;

void EventHandler()
{
    // when this function called is the end of the part that I want to measure
    t = clock() - t;
    std::cout << "time in seconds: " << ((float)t)/CLOCKS_PER_SEC;
}

int main()
{
    MyClass* instance = new MyClass(EventHandler); // this function starts a new std::thread
    instance->start(...); // this function only passes some data to the thread working data, later the thread will call EventHandler()
    t = clock();
    return 0;
}

So it is guaranteed that the EventHandler() will be called only once, and only after an instance->start() call.

It is working, this code give me some output, but it is a horrible code, it uses global variable and different threads access global variable. However I can't change the used API (the constructor, the way the thread calls to EventHandler).

I would like to ask if a better solution exists.

Thank you.


Solution

  • Global variable is unavoidable, as long as MyClass expects a plain function and there's no way to pass some context pointer along with the function...

    You could write the code in a slightly more tidy way, though:

    #include <future>
    #include <thread>
    #include <chrono>
    #include <iostream>
    
    struct MyClass
    {
        typedef void (CallbackFunc)();
    
        constexpr explicit MyClass(CallbackFunc* handler)
         : m_handler(handler)
        {
        }
    
        void Start()
        {
            std::thread(&MyClass::ThreadFunc, this).detach();
        }
    
    private:
        void ThreadFunc()
        {
            std::this_thread::sleep_for(std::chrono::seconds(5));
            m_handler();
        }
    
        CallbackFunc*     m_handler;
    };
    
    
    std::promise<std::chrono::time_point<std::chrono::high_resolution_clock>>   gEndTime;
    
    void EventHandler()
    {
        gEndTime.set_value(std::chrono::high_resolution_clock::now());
    }
    
    
    int main()
    {
        MyClass         task(EventHandler);
    
        auto            trigger = gEndTime.get_future();
        auto            startTime = std::chrono::high_resolution_clock::now();
        task.Start();
        trigger.wait();
    
        std::chrono::duration<double>   diff = trigger.get() - startTime;
    
        std::cout << "Duration = " << diff.count() << " secs." << std::endl;
    
        return 0;
    }