【问题标题】:Measure time between library call and callback测量库调用和回调之间的时间
【发布时间】:2011-02-10 01:33:54
【问题描述】:

嗨:在一个 iPhone 应用程序中,我使用了一个库(C++),它在计算完成时异步进行回调。 现在我想测量花费的时间 - 包括调用库的方法 - 直到进行回调。是否有可能使用 Apple 的 Instruments 应用程序来做到这一点?最佳做法是什么?

【问题讨论】:

    标签: c++ iphone objective-c instruments performance


    【解决方案1】:

    过去,我曾使用以下方法进行网络调用,我必须对其进行优化 - 虽然起初看起来有点复杂,但它确实给出了我见过的最准确的时间。

    uint64_t time_a = mach_absolute_time();
    
    // do stuff
    
    uint64_t time_b = mach_absolute_time();
    
    [self logTime:(time_b-time_a)];
    
    - (void) logTime:(uint64_t)machTime {
        static double timeScaleSeconds = 0.0;
        if (timeScaleSeconds == 0.0) {
            mach_timebase_info_data_t timebaseInfo;
            if (mach_timebase_info(&timebaseInfo) == KERN_SUCCESS) {
                double timeScaleMicroSeconds = ((double) timebaseInfo.numer / (double) timebaseInfo.denom) / 1000;
                timeScaleSeconds = timeScaleMicroSeconds / 1000000;
            }
        }
    
        NSLog(@"%g seconds", timeScaleSeconds*machTime);
    }
    

    【讨论】:

      【解决方案2】:

      我编写了一个 c++ 类来包装 mach_absolute_time 调用。这使得在事件的开始/停止时撒上代码来测量时差变得很方便。

      如果您想在类中使用它来进行计时(在调用之间)或用于基于状态的行为(在计时器到达 X 后做某事),它也很有效。

      StopWatch.h

      class StopWatch
      {
      private:
              uint64 _start;
              uint64 _stop;
              uint64 _elapsed;
      public:
         void Start();
         void Stop();
         void Reset();
         void Continue();
         double GetSeconds();
      };
      

      StopWatch.cpp

      #include "Stopwatch.h"
      #include <mach/mach_time.h>
      
      
      void StopWatch::Start()
      {
              _stop = 0;
              _elapsed = 0;
              _start = mach_absolute_time();
      }
      
      void StopWatch::Stop()
      {
              _stop = mach_absolute_time();
         if(_start > 0)
         {
            if(_stop > _start)
            {
               _elapsed = _stop - _start;
            }
         }
      }
      
      void StopWatch::Reset()
      {
         _start = 0;
         _stop  = 0;
         _elapsed = 0;
      }
      
      void StopWatch::Continue()
      {
         _elapsed = 0;
         _stop = 0;
      }
      
      double StopWatch::GetSeconds()
      {
         double elapsedSeconds = 0.0;
         uint64 elapsedTimeNano = 0;
      
              if(_elapsed > 0)
              {  // Stopped
                      mach_timebase_info_data_t timeBaseInfo;
                      mach_timebase_info(&timeBaseInfo);
                      elapsedTimeNano = _elapsed * timeBaseInfo.numer / timeBaseInfo.denom;
                      elapsedSeconds = elapsedTimeNano * 1.0E-9;
              }
              else if(_start > 0)
              {  // Running or Continued
            uint64_t elapsedTemp;
                      uint64_t stopTemp = mach_absolute_time();
            if(stopTemp > _start)
            {
               elapsedTemp = stopTemp - _start;
            }
            else
            {
               elapsedTemp = 0;
            }
                      mach_timebase_info_data_t timeBaseInfo;
                      mach_timebase_info(&timeBaseInfo);
                      elapsedTimeNano = elapsedTemp * timeBaseInfo.numer / timeBaseInfo.denom;
                      elapsedSeconds = elapsedTimeNano * 1.0E-9;
              }
         return elapsedSeconds;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-20
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多