13

いくつかのパフォーマンス タイミングを実行するために、iPhone 用の高解像度タイミング コードを探しています。次のようなコードを書きたいと思います。

HighResolutionTimer* myTimer = [[HighResolutionTimer alloc]init];
[myTimer start];
[self doSomeLengthyOperation];
NSLog( @"doSomeLengthyOperation took %f seconds", [myTimer elapsedTime] );
4

4 に答える 4

26

mach / mach_time.hヘッダーのmach_absolute_time()を調べます。

NSDateは使用しないでください。NSDateは、ntpが処理を実行するときに、ときどき逆戻りしないことが保証されていません。

(デバイスはクロックドリフトを起こす可能性があります。iOSデバイスが数秒速くドリフトする場合、NTPがこのドリフトを修正すると、クロックが突然数秒後退するのがわかります。タイミングの使用には非常に悪いです。mach_timeはそうでないカウンターを使用しますNTPによって修正されることがあるため、後戻りできないため、タイミングがはるかに優れています。)

于 2010-08-22T07:50:55.657 に答える
16

より良いオプションはCACurrentMediaTime()、使用しますが、それを a (つまり、double としての秒単位の時間) にmach_absolute_time()変換します。CFTimeInterval

于 2012-08-14T07:44:47.403 に答える
8

ここに示されmach_absolute_time()ている計算方法に基づいて、 と の両方を使用する時計タイマーに対する私の答えは次のとおりです。精度に関しては、実際には同じです。NSDate

マッハ版

double machGetClockS()
{
  static bool init = 0 ;
  static mach_timebase_info_data_t tbInfo ;
  static double conversionFactor ;
  if(!init)
  {
    init = 1 ;
    // get the time base
    mach_timebase_info( &tbInfo ) ;
    conversionFactor = tbInfo.numer / (1e9*tbInfo.denom) ; // ns->s
  }

  return mach_absolute_time() * conversionFactor ; // seconds
}

double machGetClockDiffS()
{
  static double lastTime = 0;

  double currentTime = machGetClockS() ;

  double diff = currentTime - lastTime ;

  lastTime = currentTime ; // update for next call

  return diff ; // that's your answer
}

NSTimeInterval バージョン

double getClockS()
{
  return [NSDate timeIntervalSinceReferenceDate] ; // NSTimeInterval is always specified in seconds 
}

double getClockDiffS()
{
  static double lastTime = 0 ;

  double currentTime = getClockS() ;

  double diff = currentTime - lastTime ;

  lastTime = currentTime ; // update for next call

  return diff ; // that's your answer
}

結果:

これらの両方の解像度が本当に良いことに注意してください。

IOS SIMULATOR、実行中のフレーム レート カウント (ミリ秒単位 (*1000.0))

MACH_ABS_TIME / NSTimeIntervals
58.557001 / 58.552980
40.558007 / 40.562987
52.207822 / 52.200019
33.742197 / 33.742011
38.498912 / 38.504004
48.872679 / 48.868001
45.012602 / 45.011997
57.858432 / 57.865977
25.044615 / 25.038004


iPad ハードウェアのサンプリング:
33.415041 / 33.416033
33.240167 / 33.239007
33.357542 / 33.357978
33.302833 / 33.302009
33.506750 / 33.509016
33.582250 / 33.582985
33.233958 / 33.232987
33.239042 / 33.237994

※この投稿の編集履歴を見ると、 !floatの代わりに使う危険性が分かります。double

于 2012-09-23T14:58:37.840 に答える
5

NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate]開始時刻を取得し、最後に使用しますNSLog (@"Operation took %f seconds.", [NSDate timeIntervalSinceReferenceDate] - startTime);

于 2010-08-22T05:04:30.440 に答える