3

私はいくつかの大規模なタイムスタンプ リストの反復を行っています: それらを date-ranges のテーブルに入れ、範囲でグループ化します。そのためにとても便利な機能を見つけたのですが、その性能strtotime()が気になります。

たとえば、週のリスト (たとえば、49 週目から 05 週目) をループし、週の始まりとその週の終わりのタイムスタンプを決定する必要がある関数。それを行う便利な方法は次のとおりです。

foreach ($this->weeks($first, $amount) as $starts_at) {
  $ends_at = strtotime('+1 week', $starts_at);
  $groups[$week_key] = $this->slice($timestamps, $starts_at, $ends_at);
}

//$this->weeks returns a list of timestamps at which each week starts.
//$this->slice is a simple helper that returns only the timestamps within a range, from a list of timestamps. 

の代わりにstrtotime()、可能性として、週の開始から終了までの秒数を調べることができます。99% の時間は24 * 60 * 60 * 7. しかし、DST スイッチがあるこれらのまれなケースでは、その 24 は 23 または 25 のいずれかである必要がstrtotime()あります。

年、月 (月、非常に一貫性がありません!)、日、時間の範囲で同じパターンを使用します。3600タイムスタンプに単純に追加する方が速いと思うのは、数時間だけです。

他の落とし穴はありますか?一貫性のある、DST およびうるう年の安全な日付範囲のためのより良いルートを提供する方法 (PHP5.3 に依存しない!) はありますか?

4

4 に答える 4

12

なぜそのパフォーマンスを心配しているのですか?システムの速度が低下しているという証拠はありますか? そうでない場合は、不必要な理由でソリューションを過度に複雑にしないでください。覚えておいてくださいpremature optimization is the root of all evil。意味のある読みやすいコードを書き、問題になることがわかっている場合にのみ最適化します...

しかし、考慮すべきもう 1 つの点は、コンパイルされた C コードでもあるということです。そのため、その機能は非常に効率的であるはずです。PHP ランドでコードのサブセットをビルドして高速化できるかもしれませんが、(PHP コードに関連するすべてのオーバーヘッドのために) 難しい仕事になるでしょう。

前に言ったように、それが問題であることが証明されるまで使用してから、その問題を修正してください。必要に応じて書き直すことも無料ではないことを忘れないでください。時間がかかり、バグが発生します。ゲインが最小限であれば、それだけの価値がありますか (つまり、最初からパフォーマンスの問題ではなかったということです)。したがって、問題があることがわかっていない限り、わざわざマイクロ最適化を試みないでください...

于 2010-10-12T13:13:39.063 に答える
1

これはおそらくあなたが探している答えではないことはわかっていますが、実際のユースケースを念頭に置いてプロファイリングするのが最善の策です.

私の本能は、あなたが思うstrtotimeように遅くなるということです。しかし、たとえば 3 倍遅い場合でも、これはコンテキスト内でのみ意味があります。おそらく、実際のデータを使用したルーチンでは、strtotime を使用して 60 ミリ秒かかるため、ほとんどの場合、40 ミリ秒節約できます (これらの数値は完全に作り上げましたが、おわかりでしょう)。したがって、これを最適化しても実際には効果がないことに気付くかもしれません (コードをより多くの潜在的なバグにさらすことになり、それを正しくするためにさらに多くの時間を費やす必要があることを考えると)。

ところで、優れたプロファイリング ツールを使用している場合はすばらしいですが、タイムスタンプを比較しなくても大まかなアイデアが得られるはずです。

于 2010-10-11T15:28:52.377 に答える
0

非常に興味深い質問です。これを実際に理解できる唯一の方法は、独自のパフォーマンス テストを設定することです。スクリプトの最初と最後にある microtime() の値を観察して、パフォーマンスを判断します。1 つのメソッドを使用してループを実行し、次に別のメソッドを使用して、途方もない数の値を実行します。時間を比較します。

于 2010-10-11T15:26:45.143 に答える