2

真夜中までカウントダウンするタイマーである小さなプロジェクトがあり、毎秒真夜中までの時間を計算して、そのままにしておくべきかどうか疑問に思っていました(1秒ごとに呼び出されるNSTimerメソッド内):

NSDate *now = [[NSDate alloc] init];
NSDateComponents *dateComponents = [[self gregorian] components:
                    (NSHourCalendarUnit |
                    NSMinuteCalendarUnit |
                    NSSecondCalendarUnit) fromDate:now];
[now release];
NSUInteger hour = 23 - [dateComponents hour];
NSUInteger min = 59 - [dateComponents minute];
NSUInteger sec = 59 - [dateComponents second];

NSString *time = [[NSString alloc] initWithFormat:@"%02d:%02d:%02d",
                  hour, min, sec];
[[self lblCountDown] setText:
 [time stringByReplacingOccurrencesOfString:@"1" withString:@" 1"]];
[time release];

または、最初にそれを計算してから、呼び出しごとに 1 秒に同期されてから、1 回おきに 1 秒ずつ減算する必要がありますか? これに1秒以上かかることは心配していませんが、結果が同じになる場合は、最適化しない理由はありません..とにかく、そのようにする必要がありますか? なぜ?

ありがとう。

4

2 に答える 2

2

時期尚早の最適化は常に悪いことです。1 年後にはデバッグできないコードを今書いてはいけません。次のことを行うまで、最適化を行わないでください。

  1. 動作するアプリケーションを用意してください。
  2. 動作中のアプリケーションのパフォーマンスが実際に悪い。
  3. 実際のブートル ネックを見つけるための計装を行いました。
  4. 最適なアルゴリズムを使用していることは確かです。
  5. コードの明瞭さを犠牲にすることなく最適化する方法を見つけました。

以上のことから、1 秒に 1 回現在の時刻を確認しても、パフォーマンスが低下することはありません。したがって、明らかに、最適化を適用するための要件 2 にも合格していません。

于 2009-10-02T08:13:41.447 に答える
2

「最適化しない理由はない」というステートメントは危険です。最適化しない理由がないのではなく、最適化する理由が必要です。このコードは、実行にあまり時間がかからないかなり合理的な小さな切り取りです。

正確さに関しては、正確な時間を維持するための唯一の合理的な方法は、システムに任せることです。「現在」の時間を取得することは、その方法です。それを自分の手に取ると、時計が誤差に陥る可能性が高く、気付くのに十分な場合もあれば、そうでない場合もあります.

最適化については、プロファイルを作成し、速度を確認し、問題があれば修正し、問題がなければもっと楽しいことに移りましょう!

于 2009-10-02T02:25:46.687 に答える