今天看荣哥时间常用函数封装里有个不常见的函数 ,mach_absolute_time() ,经查询后感觉是个不错的函数,网上关于这个函数搜索以后简单整理来一下。

什么事Mach?

时间例程依赖于所需要测量的时间域。 某些情况下使用诸如clock() 或 getrusage()函数来做简单的数学运算就足够了。如果时间例程将用于实际开发框架之外,可移植性就很重要来。

mach_absolute_time  是一个CPU/总线依赖函数,返回一个基于系统启动后的时钟"嘀嗒"数。在macOS上可以确保它的行为,并且,它包含系统时钟所包含的所有时间区域。其可获取纳秒级的精度。

使用mac_absolute_time时需要考虑两个因素:

1.如何获取当前的Mach绝对时间。

2.如何将其转换为有意义的数字。

* 获取mach_absolute_time非常简单

#include <stdint.h>

uint64_t start = mach_absolute_time();//是纳秒
uint64_t stop = mach_absolute_time();

这样我们就可以得到两个值,即可获得两个时间的时间差。

* 讲mach_absolute_time时间差转换为秒数,这稍微复杂点了,因为我们需要获得mach_absolute_time所基于的系统时间基准。

#include <stdint.h>
#include <mach/mach_time.h> double subtractTimes(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); //convert the timebase into seconds
if(err ==)
{
conversion = 1e- * (double) info.numer / (double)info.denom;
  }
return conversion * (double)difference;
}

这里最重要的是调用mach_timebase_info. 我们传递一个结构体以返回时间基准值。最后,一旦我们获取到了系统的时间心跳,我们便能够生成一个转换因子。通常,转换是通过分子(info.numer)除以分母(info.denom).这里乘以一个1e-9来获取秒数。最后,我们获取两个时间的差值,并乘以转换因子,便得到真实的时间差。

网速找的一个比较好的例子:

#import <mach/mach_time.h>

double machTimeToSecs(uint64_t time)
{
  mach_timebase_info_data_t timebase;
  mach_timebase_info(&timebase);
  return(double)time *(double)timebase.number / (double)timebase.denom / 1e9;
} -(void)profileDoSometing
{
  uint64_t begin = mach_absolute_time();
  [self dosomething];
  uint64_t end = mach_absolute_time();
  NSLog(@"Time taken to doSomething %g s",machTimeToSecs(end - begin));
} -(void)dosomething
{
  for(int i = 0;i < 10000;i++){     NSLog(@"test");
  }
}

  

荣哥封装的是这样的:

+ (uint64_t)getStartTime
{
uint64_t nStartTick = mach_absolute_time();// 单位事纳秒
return nStartTick;
} + (double)getDurationSecondTime:(uint64_t)nStartTick
{
uint64_t nTotalTick = mach_absolute_time()-nStartTick;
double fTotalSecond = [self machTimeToSecs: nTotalTick];
return fTotalSecond;
} + (double)machTimeToSecs:(uint64_t)time
{
mach_timebase_info_data_t timebase;
mach_timebase_info(&timebase);
return (double)time*(double)timebase.numer/(double)timebase.denom/1e9;//ns 转换为 s
}

使用时候,直接调用getStartTime开始计时,调用getDurationSecondTime获得结束时间

网上还有一个通过该函数测某方法运行时间,以便代码优化,感觉也是不错的,记录下来以便备用。

#import <Foundation/Foundation.h>
#import "TimeOperations.h" #define LOOPAGE 10000000 CGFloat BNRTimeBlock (void (^block)(void)) {
mach_timebase_info_data_t info;
if (mach_timebase_info(&info) != KERN_SUCCESS) return -1.0; uint64_t start = mach_absolute_time ();
block ();
uint64_t end = mach_absolute_time ();
uint64_t elapsed = end - start; uint64_t nanos = elapsed * info.numer / info.denom;
return (CGFloat)nanos / NSEC_PER_SEC; } // BNRTimeBlock int main(int argc, const char * argv[]) {
@autoreleasepool { CGFloat time; NSString *thing1 = @"hi";
NSString *thing2 = @"hello there"; time = BNRTimeBlock(^{
for (int i = ; i < LOOPAGE; i++) {
[thing1 isEqual: thing2];
}
});
printf ("isEqual: time: %f\n", time); time = BNRTimeBlock(^{
for (int i = ; i < LOOPAGE; i++) {
[thing1 isEqualToString: thing2];
}
});
printf ("isEqualToString: time: %f\n", time); }
return ;
}
CGFloat ComputeTimeBlock (void (^block)(void)) {
mach_timebase_info_data_t info;
if (mach_timebase_info(&info) != KERN_SUCCESS) return -1.0; uint64_t start = mach_absolute_time ();
block ();
uint64_t end = mach_absolute_time (); // 此时是纳秒
uint64_t elapsed = end - start; uint64_t nanos = elapsed * info.numer / info.denom;
CGFloat test = (CGFloat)nanos / NSEC_PER_SEC;
return test;
} CGFloat ComputeTimeBlock2 (void (^block)(void)) {
mach_timebase_info_data_t info;
if (mach_timebase_info(&info) != KERN_SUCCESS) return -1.0; uint64_t start = CACurrentMediaTime(); // 此时是秒
block ();
uint64_t end = CACurrentMediaTime();
uint64_t elapsed = end - start; return elapsed;
}

mach_absolute_time 使用的更多相关文章

  1. iOS.mach_absolute_time

    1. Technical Q&A QA1398 Mach Absolute Time Units https://developer.apple.com/library/mac/qa/qa13 ...

  2. 谈谈iOS Animation

    零.前言 这里没有太多的代码细节,只是探索iOS动画的基本概念,以及其抽象模型,数学基础等.我们学习一个知识的时候一般有两个部分,抽象部分和形象部分,抽象好比语言的语法,是规则,形象好比具体的句子,可 ...

  3. iOS 时间的处理

    做App避免不了要和时间打交道,关于时间的处理,里面有不少门道,远不是一行API调用,获取当前系统时间这么简单.我们需要了解与时间相关的各种API之间的差别,再因场景而异去设计相应的机制. 时间的形式 ...

  4. 深入理解RunLoop

    网上看的一篇文章,写的真好,我得多看几次好好理解理解 膜拜大神,转载至此便于学习查看. 此处标明原文链接:http://blog.ibireme.com/2015/05/18/runloop/    ...

  5. 使用Objective-C 计算代码运行时间

    第一种:(最简单的NSDate) NSDate* tmpStartData = [NSDate date]; //You code here... double deltaTime = [[NSDat ...

  6. 浅谈Runloop

    RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...

  7. Runloop 深入理解(转)

    RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...

  8. iOS-性能优化1

      iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象.还记得12306么,那个速度,相信大家都 ...

  9. iOS-性能优化2

    性能优化总结2 iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象.还记得12306么,那个速度 ...

随机推荐

  1. vue缓存之keep-alive,设置想要缓存的页面

    由于项目需求从a页面跳转到b页面,返回a页面,a页面数据不能被刷新掉,方法很多列举12 方法1 a页面通过学期按钮切换学期,该学期里more进入b页面,返回a页面,返回回到对应a页面进入的高亮按钮设置 ...

  2. L1-030 一帮一(15)(代码)

    L1-030 一帮一(15 分) "一帮一学习小组"是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组.本题就请你编写程序帮助老师自动完成这个分配工 ...

  3. epoll机制:epoll_create、epoll_ctl、epoll_wait、close

      在Linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是epoll.相比于select,epoll最大的好处在于它不会随着监听fd数 ...

  4. Rsync同步设置的一例

    以下文档于2014-12-10更新   先在服务端操作 #wget http://pkgs.repoforge.org/rsync/rsync-3.0.9-2.el6.rfx.x86_64.rpm # ...

  5. [SoapUI] Groovy获取HTTP Status

    def value = messageExchange.responseHeaders["#status#"] def httpResponseHeaders = context. ...

  6. How to Create Triggers in MySQL

    https://www.sitepoint.com/how-to-create-mysql-triggers/ I created two tables: CREATE TABLE `sw_user` ...

  7. Peter的烟(水题测试2017082401&洛谷1150)

    题目链接:Peter的烟 这道题基本做法很水,不解释. #include<bits/stdc++.h> using namespace std; int main(){ int n,k; ...

  8. json(原生态)

    什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSO ...

  9. Python之入门篇1

    一.安装python解释器 官网: https://www.python.org/downloads/windows/ 自行下载安装,添加环境变量 #测试安装是否成功 windows --> 运 ...

  10. unity3d的执行顺序