2

比較の結果を再計算するのではなく、保存することが理にかなっている場合 (使用可能なメモリ領域を無視する場合) をしっかりと理解したいと思います。ストレージによって発生する時間コストを正当化するための転換点は何ですか? 比較回数は 2 回、3 回、または 4 回ですか。もっと?

たとえば、この特定のケースでは、どのオプションが (一般的に) 速度の面で優れているでしょうか?

オプション1:

int result = id.compareTo(node.id);

return result > 0 ? 1 : result < 0 ? -1 : 0;

オプション 2:

return id.compareTo(node.id) > 0 ? 1 : id.compareTo(node.id) < 0 ? -1 : 0;

私は自分自身の質問に答えるために 2 つのオプションを自分でプロファイリングしようとしましたが、この種のパフォーマンス テストの経験があまりないため、より経験のある人からより決定的な回答を得たいと思っています。関連する理論的要素をよりよく理解する。

大したことではなく、ほとんどの場合、違いはごくわずかであることはわかっています。しかし、私は完璧主義者で、この特定の問題を解決して、自分の人生をやり遂げたいと思っています (笑)。

さらに、将来遭遇する可能性のある同様の状況に関して、違いが非常に大きくなる可能性がある場合(比較またはメモリ割り当てのコストが発生しない場合など)について、答えが啓発的であることが証明される可能性が高いと思いますパフォーマンスに関する実際の問題を引き起こすほど複雑です)。

回答は、他の言語ではなく、Java でのプログラミングに関連する必要があります。

すでに数回言及したことは知っていますが、回答は速度の違いだけに集中してください。コードを記述する際に、他の多くの要因を考慮に入れることができ、また考慮に入れる必要があることは十分承知していますが、ここでは、どれがより速いかについての単純明快な議論をしたいと思います。

4

4 に答える 4

2

経験上、オプション 1 の方が高速であることがわかっています。なぜなら、compare メソッドを 1 回呼び出すだけで、結果を保存して再利用できるからです。この信念を裏付ける事実は、ローカル変数がスタック上に存在し、メソッド呼び出しを行うには、スタックに値をプッシュするだけでなく、スタックからの多くの作業が必要になることです。ただし、プロファイリングは、2 つの実装を比較するための最良かつ最も安全な方法です。

最初に認識すべきことは、Java コンパイラと JVM が一緒になって、ジョブを最も効率的に実行したい方法でコードを最適化する可能性があるということです (特定の規則が守られている限り)。パフォーマンスに違いはない可能性があり、実際に実行されることは、あなたが思っているものとは異なる可能性もあります。ただし、1 つの非常に重要な違いはデバッグにあります。変数にストア バージョンの return ステートメントにブレーク ポイントを配置すると、呼び出しから何が返されたかを確認できます。そうしないと、デバッガーで確認できません。さらに便利なのは、メソッドから返される値を一見無駄に変数に格納してから返す場合です。そのため、デバッグ中にメソッドから返されるものを見ることができます。そうしないと、それを見る方法がありません。

于 2013-03-19T12:16:04.650 に答える
1

オプション 1 は 2 より遅くすることはできません。コンパイラが最適化する場合、両方が等しくなる可能性がありますが、それでも 1) の方が読みやすく、コンパクトで、テストしやすいです。

したがって、オプション 2 の引数はありません)。

必要に応じて変更できますがfinal int result = .... 、コンパイラは非常に賢いため、この場合、 final キーワードは違いがなく、 final によりコードが少し読みにくくなります。

于 2013-03-19T13:12:45.847 に答える
0

速度の観点から、比較の結果を保存することと、比較を再計算することのどちらが理にかなっているのですか?

ほとんどの場合、オプション #1 とオプション #2 のようなマイクロ最適化では、大きな違いはありません。実際、次の場合にのみ大幅なパフォーマンスの違いが生じます。

  • 比較は高価です、
  • 比較が何度も実行され、かつ
  • パフォーマンスが重要です。

実際、アプリケーションの有効期間全体で節約できるよりも多くの時間とお金をこれについて考えている可能性があります。

パフォーマンスに重点を置くのではなく、コードを読みやすくすることに重点を置く必要があります。次にコードを読んで修正しなければならない人のことを考え、その人がコードを読み間違えないようにします。

この場合、最初のオプションは 2 番目のオプションより読みやすくなります。それが、パフォーマンス上の理由ではなく、使用する必要がある理由です。(ただし、どちらかといえば、最初のバージョンの方がおそらく高速です。)

于 2013-03-19T13:13:36.787 に答える
0

ここでは現実世界のシナリオであるため、オプション1は常に優先されます

----->わかりました

1) id.compareTo(node.id) > 0 でのスレッド実行 ? 1 、このプロセスでは他のスレッド

id.compareTo(node.id) > 0 ? 1に行く直前にnode.id の値を変更します

id.compareTo(node.id) < 0 ? -1 : 0このチェック、結果は同一ではありませんか?

パフォーマンスに関するオプション 1 は、チェックに少しの機能が存在する場合にパフォーマンスが向上します。

于 2013-03-19T12:24:51.817 に答える