Timer类功能是计算一个函数的执行耗时,Timer的完整代码路径如下:
https://github.com/libmozart/foundation/blob/master/mozart%2B%2B/mpp_foundation/timer.hpp

Timer的耗时测试举例如下:

int test_epoch = 10000000;

std::cout << "[Small Data] std::any copying: " << mpp::timer::measure([]() {
    std::any a(10);
    for (int i = 0; i < test_epoch; ++i)
        std::any b(a);
}) << std::endl;

timer的接口包括:reset,time,delay,measure等四个接口,而且timer的所有接口均是静态接口。

reset接口

reset接口功能是重置基准时间。函数定义如下:

// 基准时间成员变量
static std::chrono::time_point<std::chrono::high_resolution_clock> m_timer;

static void reset() 
{
    // 重置基准时间
    m_timer = std::chrono::high_resolution_clock::now();
}

time接口

获取当前时间相对与基准时间的偏移值。其定义如下:

static size_t time(time_unit unit = time_unit::milliseconds)
{
    switch (unit) 
    {
        case time_unit::nanoseconds:
            return std::chrono::duration_cast<std::chrono::nanoseconds>(
                    std::chrono::high_resolution_clock::now() - m_timer)
                    .count();
        case time_unit::microseconds:
            return std::chrono::duration_cast<std::chrono::microseconds>(
                    std::chrono::high_resolution_clock::now() - m_timer)
                    .count();
        case time_unit::milliseconds:
            return std::chrono::duration_cast<std::chrono::milliseconds>(
                    std::chrono::high_resolution_clock::now() - m_timer)
                    .count();
        case time_unit::seconds:
            return std::chrono::duration_cast<std::chrono::seconds>(
                    std::chrono::high_resolution_clock::now() - m_timer)
                    .count();
        case time_unit::minutes:
            return std::chrono::duration_cast<std::chrono::minutes>(
                    std::chrono::high_resolution_clock::now() - m_timer)
                    .count();
    }
    return 0;
}

measure接口

函数耗时测量接口,const function<void()> &func 为待测试的函数对象,time_unit unit = time_unit::milliseconds 耗时时间单位。measure支持5中测量单位,他们分别为纳秒,微秒,毫秒,秒和分。其中时间单位定义如下:

enum class time_unit 
{
    nanoseconds,  // 纳秒
    microseconds, // 微秒
    milliseconds, // 毫秒
    seconds,      // 秒
    minutes       // 分
};

measure 接口定义如下:

static size_t measure(const function<void()> &func, time_unit unit = time_unit::milliseconds) 
{
    size_t begin(0), end(0);
    begin = time(unit);  // 相对于基准时间的起始偏移
    func();
    end = time(unit);    // 相对于基准时间的终止偏移
    return end - begin;  // 终止偏移 - 起始偏移 = 函数耗时
}

delay接口

延时指定时间间隔,入参包括延时时间(size_t time)和延时时间单位(time_unit unit = time_unit::milliseconds默认毫秒),其定义如下:

static void delay(size_t time, time_unit unit = time_unit::milliseconds) 
{
    switch (unit) 
    {
        case time_unit::nanoseconds:
            std::this_thread::sleep_for(std::chrono::nanoseconds(time));
            break;
        case time_unit::microseconds:
            std::this_thread::sleep_for(std::chrono::microseconds(time));
            break;
        case time_unit::milliseconds:
            std::this_thread::sleep_for(std::chrono::milliseconds(time));
            break;
        case time_unit::seconds:
            std::this_thread::sleep_for(std::chrono::seconds(time));
            break;
        case time_unit::minutes:
            std::this_thread::sleep_for(std::chrono::minutes(time));
            break;
    }
}

总结

timer是Mozart的应用接口,作用是测试相关函数的执行耗时。一般我们只需要关注timer::measure接口即可。

09-06 19:26