usr/include/dispatch - time.h

#include <dispatch.h>

macros:

#define NSEC_PER_SEC 1000000000ull
#define NSEC_PER_MSEC 1000000ull
#define USEC_PER_SEC 1000000ull
#define NSEC_PER_USEC 1000ull

#define DISPATCH_TIME_NOW (0ull)
#define DISPATCH_TIME_FOREVER (~0ull)

API

/*!
 * @abstract
 * 根据默认时钟或者调整一个存在的dispatch_time_t来创建一个dispatch_time_t
 *
 * @discussion
 * 在Mac OS X 默认的时钟是基于 mach_absolute_time().
 *
 * @param when
 * 可选择项,参数为dispatch_time_t这样纳秒,如果输入为零,dispatch_time()这个API将会使用mach_absolute_time()的结果
 *
 * @param delta
 * 延迟秒数,单位纳秒
 *
 * @result
 * 返回新的dispatch_time_t
 */
dispatch_time_t
dispatch_time(dispatch_time_t when, int64_t delta);

/*!
 * @abstract
 * 使用“挂钟”创建dispatch_time_t
 *
 * @discussion
 * 在Mac OS X 默认的时钟是基于 gettimeofday(3).
 *
 * @param when
 * 结构体timespec,如果输入NULL,dispatch_walltime()这个API将会使用gettimeofday(3)的结果
 *
 * @param delta
 * 延迟秒数,单位纳秒
 * 
 * @result
 * 返回新的dispatch_time_t
 */
dispatch_time_t
dispatch_walltime(const struct timespec *when, int64_t delta);

mach_absolute_time##

mach_absolute_time()在Linux下不受修改系统时间影响而且能够接近毫秒级别的API

mach_absolute_time是一个CPU/总线依赖函数,返回一个机遇系统启动后的时钟的计数,在Mac OS X上的它包含时钟内部的所有时间区域。对于测试,它是一个很有用的API。

1.获取mach_absolute_time###

#include <mach/mach_time.h>

uint64_t start = mach_absolute_time();
uint64_t stop = mach_absolute_time();

2.把mach_absolute_time时间差转化为秒数

double_t subtrackTimes(uint64_t endTime, uint64_t startTime)
{
    uint64_t difference = endTime - startTime;
    static double conversion = 0.0;
    
    if (conversion == 0.0) {
        mach_timebase_info_data_t info;
        kern_return_t err = mach_timebase_info(&info);
        if (err == 0) {
            conversion = 1e-9 * (double)info.numer/(double)info.denom;
        }
        return conversion * (double)difference;
    }
    return 0.0;
}

优秀的
博客1
博客2


dispatch_walltime##

dispatch_walltime函数是以一个timesepc结构体类型的时间结构创建的一个dispatch_time_t类型的时间,我看很多博客都解释他是创建绝对时间,例如:何年何月何日几点几分几秒这样的时间点,但是根据爱因斯坦他们对这个东西的模糊定义,我觉得dispatch_walltime更应该被称为时间点。

1.根据NSDate创建dispatch_time_t对象###

自定义函数:

dispatch_time_t getDispatchTimeByDate(NSDate *date)
{
    NSTimeInterval interval;
    double second, subsecond;
    struct timespec time;
    dispatch_time_t walltime;
    
    interval     = [date timeIntervalSince1970];
    subsecond    = modf(interval, &second);
    time.tv_sec  = second;
    time.tv_nsec = subsecond * NSEC_PER_SEC;
    walltime     = dispatch_walltime(&time, 0);
    
    return walltime;
}

演示代码:

getDispatchTimeByDate([NSDate dateWithTimeIntervalSinceNow:3]

dispatch_time和dispatch_walltime方法区别####

posted @ 2016-04-25 22:12  lvable  阅读(471)  评论(0)    收藏  举报