【问题标题】:How do I accurately time how long it takes to call a function on the iPhone?如何准确计时在 iPhone 上调用函数所需的时间?
【发布时间】:2009-03-14 21:59:15
【问题描述】:

我想知道以至少 1 毫秒的精度向对象发送消息需要多长时间。我该怎么做?

【问题讨论】:

    标签: iphone benchmarking


    【解决方案1】:

    您可以使用mach_absolute_time 以纳秒为单位进行测量。

    #import <mach/mach_time.h>
    
    uint64_t startTime = 0;
    uint64_t endTime = 0;
    uint64_t elapsedTime = 0;
    uint64_t elapsedTimeNano = 0;
    
    mach_timebase_info_data_t timeBaseInfo;
    mach_timebase_info(&timeBaseInfo);
    
    startTime = mach_absolute_time();
    
    //do something here
    
    endTime = mach_absolute_time();
    
    elapsedTime = endTime - startTime;
    elapsedTimeNano = elapsedTime * timeBaseInfo.numer / timeBaseInfo.denom;
    

    参考: Technical Q&A QA1398: Mach Absolute Time Units

    【讨论】:

      【解决方案2】:

      这是我的工作:

      NSDate * start = [NSDate date];
      // do whatever I need to time
      NSLog(@"time took: %f", -[start timeIntervalSinceNow]);
      

      输出将以秒为单位(带小数部分)。 NSDates 具有毫秒级的分辨率,尽管我不确定它们的精确度。

      如果您尝试计时的代码太快,请将其放入一个运行代码一百次的循环中。 (当然,这假设您正在计时的代码没有副作用。)

      【讨论】:

      • 这就是我运行的。我个人不在乎它是否太快,因为我只关心瓶颈。 =)
      【解决方案3】:

      使用 dispatch_benchmark 以纳秒为单位记录方法执行时间。
      它具有比手动循环和调用 ma​​ch_absolute_time() 更好的语法,dispatch_benchmark 是 Grand Central Dispatch 的一部分。此函数未公开声明,因此您必须在使用前自行声明:

      extern uint64_t dispatch_benchmark(size_t count, void (^block)(void));

      我用它来记录日志执行时间:

      size_t const  blockIterations = 1; //block call count
      uint64_t t = dispatch_benchmark(blockIterations, ^{ //your code inside block
              [self TEST_processJSONDataRecordsWithCompletionHandler:^(id handler) {}];
          });
      NSLog(@" Avg. Runtime in nanoseconds : %llu ns", t);
      

      归功于Benchmarking

      【讨论】:

      • 如果不公开,在 Swift 中是否还有dispatch_benchmark
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2022-01-16
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多