2016-08-10 1 views
0

私は、iOSアプリケーション用の単体テストの1つが断続的に失敗していることに気付き、何が起きているのか調べました。 intervalは、メソッド呼び出しと[NSDate date]の2回の呼び出しの間のヌルチェックがあるにもかかわらず、すべての今してゼロなってしまう、私のマシン上で[NSDate date]への隣接呼び出しは、必ずしも異なるタイムスタンプを生成するとは限りません。

NSDate *someDate = [NSDate date]; 

// Make a method call which accepts someDate as a param. 
// Inside the method, check the param for null, and then: 
NSDate *currentDate = [NSDate date]; 
NSTimeInterval interval = [currentDate timeIntervalSinceDate:someDate]; 

:影響を受けるコードパスがに簡素化することができます。私は1000回の反復でforループでテストを実行しました。そして、 'interval'がゼロである場合には約3回の反復しか必要としませんでした。私は日付が本当に同じであったことを確認するためにいくつかのブレークポイントを入れました。それは精度が失われたのはtimeIntervalSinceDateのアーティファクトだけではありませんでした。

これは以前はthis questionで観察されていたようですが、答えは私にはほとんど見られないはずです。私はそれが私のコンピュータ、またはOSの変更、またはその両方/両方とも関係しているのだろうかと思います。

答えて

1

CPUは高速です。 NSTimeIntervalの解像度は無限ではありません。 NSDateは、参照日からちょうどNSTimeIntervalです。 [NSDate date]への2つの呼び出しの間の命令がNSTimeIntervalによって提供される解決より短い実行時間を要する場合、それらの間の間隔はゼロになります。

+0

この解像度が何であるかを正確に調べようとしましたが、文書化されていないようです。私はときどき0.00003秒の間隔を見ることがあるので、少なくともマイクロ秒になり、日付を比較するためのNSCalendarの方法では、ナノ秒を区別することさえできるということです。私が気に入らないのは、私が予測できない "疑似ランダム"の結果です。 – RuslanD

+0

'NSTimeInterval'は、既知の解像度を持つ' double'として定義されています。あなたは、IEEE浮動小数点型を掘り下げたり、解決策を得るために良いリファレンスを見つける必要があります。私が知っていることの一つは、値の間隔は単調ではなく、浮動小数点数の小数部分が表される方法です。 – Avi

+0

逸話:何年も前、TIMESTAMPフィールドが完全に有効な主キーであると主張していたデータアーキテクト(DBスキーマデザイナー)と仕事をしました。彼女は間違っていましたが、単なる開発者は、ホーリー・データ・アーキテクトと矛盾する立場にありませんでした。企業の官僚制。/sigh – Avi

0

デバッグ領域では、時刻(someDateとcurrentDateの値)が同じです。電子5.Interval実際の値のパワーが0.000010013580322265625

Image

NOTE

ダブルフロートの精度に対し、少なくとも15桁の精度を持っているようしかし、あなたは間隔を取得しています6桁の小数にすることができます。使用する適切な浮動小数点型は、コードで扱う必要がある値の性質と範囲によって異なります。いずれかのタイプが適切である状況では、Doubleが優先されます。

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

あなたはどちらも/ OS、コンピュータまたはその両方を変更しないようにしている場合だから私は考えていません。

+0

右 - この例では、2つの日付の正規表現は文字列と同じであり、それらの間の間隔は実際には小さい値(上記の例のように)でもかまいません。 Objective-Cでは、NSTimeIntervalはすでに「double」の型エイリアスなので、浮動小数点値の切り捨てはありません。私のポストのポイントは、NSTimeIntervalがゼロであるというケースが、私が思っていたよりも頻繁に起こっているということでした。 – RuslanD

+0

"私は1000回の反復でforループでテストを実行しました"と言っているので、この反復の時間間隔は非常に近いかもしれません。ループ実行時間は考えるべき場所かもしれません。申し訳ありません兄弟:)これを助けることはできません。 – Sofeda

関連する問題