4

メソッドが呼び出された回数を追跡し、n回呼び出されたときに何かを出力する必要があるとします。最も効率的なものは何ですか:

  1. long変数_counterを使用し、メソッドが呼び出されるたびにそれを増やします。等しいかどうかをテストする各呼び出し"_counter%n == 0"

  2. int変数_counterを使用し、メソッドが呼び出されるたびにそれを増やします。_counter = nの場合、メッセージを出力し、変数_counterを0にリセットします。

違いはごくわずかで、おそらく正しいと言う人もいます。どの方法が最も一般的に使用されているのか知りたいだけです

4

6 に答える 6

7

この特定のケースでは、とにかくifステートメントが必要なので、カウントに達したときにゼロに設定する必要があります。

ただし、毎回値を使用し、「特定の値に達したときにゼロに丸める」だけの場合は、それほど明白ではありません。

n2の累乗(2、4、8、16、32 ...)になるように調整できる場合counter % nは、-と同じトリックを使用できますcounter & (n-1)。これにより、操作が非常に高速になります。

が2の累乗でない場合n、実際の除算を実行する可能性があります。これは悪い考えです。除算は通常の命令と比較して非常にコストがかかり、比較とリセットは除算オプションよりも高速である可能性が高くなります。

もちろん、他の人が言っているように、あなたのカウンターがそのタイプの最大制限に達した場合、あなたはあらゆる種類の楽しみとゲームに終わる可能性があります。

編集:そしてもちろん、何かを印刷している場合、それはおそらく分割よりも100倍長くかかるので、nかなり大きくない限り、それは実際にはマイクロ最適化です。

于 2013-02-22T16:00:59.427 に答える
1

それはnの値に依存します...しかし私はリセットするに違いありません、そして単純な同等性チェックはより速いです。さらに、カウンターをリセットする方が安全です。自分の番号の表現制限に達することはありません。編集:読みやすさも考慮してください。マイクロ最適化を行うと、コードがわかりにくくなる可能性があります。

于 2013-02-22T15:54:12.903 に答える
1

両方やってみませんか。

問題が発生した場合は、最適化する価値があるかどうかを確認してください。
しかし、それが問題になるまでそれを見ても意味がありません(アルゴリズムにははるかに大きな問題があります)。

count = (count+1) % countMax;
于 2013-02-22T16:03:53.373 に答える
0

次の理由から、カウンターをリセットする方が常に良いと思います。

  1. コードは、なじみのないプログラマー(たとえば、メンテナンスプログラマー)にとってより明確です。
  2. カウンターをリセットしたときに、算術演算(おそ​​らくスペルが間違っている)がオーバーフローする可能性は低くなります。
于 2013-02-22T15:58:24.863 に答える
0

GuavaのRateLimiterを調べると、同様のユーティリティ実装のアイデアが得られます http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/RateLimiter.html

于 2013-02-22T16:12:16.713 に答える
0

100000000回の反復のパフォーマンス時間(ミリ秒)は次のとおりです。

modTime = 1258

counterTime = 449

po2Time = 108

2の累乗は他の方法よりもはるかに優れていますが、2の累乗の場合のみ、プレーンカウンターもモジュラスの約2.5倍高速です。では、なぜモジュラス増分を使用したいのでしょうか。私の意見では、それらはクリーンなコードを提供し、適切に使用されれば、それらを知るための優れたツールになると思います。

元の投稿

于 2013-02-22T16:25:15.613 に答える