17

最近、ローカル変数が Java コードのパフォーマンスと可読性に与える影響について議論しました。私の同僚の何人かは、このような宣言は

new DoSomethingCmd(new SelectionContext(context, keys), infoStuff.getCurrentRole().getRole_id()).execute(getResultContainer());

アプリケーションのパフォーマンスを大幅に向上させます。彼らは、このためにコードの可読性を喜んで犠牲にしています。彼らがこれを主張するのは正しいですか?上記のバージョンは、たとえば、これよりも大幅にパフォーマンスが向上していますか?

final SelectionContext selectionContext = new SelectionContext(context, keys);
final String roleId = infoStuff.getCurrentRole().getRole_id();
final DeleteSomethingCmd deleteSomethingCmd = new DeleteSomethingCmd(selectionContext,roleId);
deleteSomethingCmd.execute(getResultContainer());

最初のステートメント自体を理解するのはそれほど難しいことではありませんが、ほとんどのコードがそのように構成されていると、複雑さが急速に増します。

ご意見ありがとうございます。

4

6 に答える 6

15

「最適化された」バージョンが行う唯一のことは、スタック内のいくつかの変数が少なくなり、メモリ消費がわずかに増加することです。パフォーマンスは慎重に測定する必要があります (Google で問題をベンチマークする方法) が、顕著な効果があるかどうかは真剣に疑問です。

また、頻繁に使用されないコードのパフォーマンスを改善するために時間を費やすことは、コストのかかる開発者の時間の浪費にすぎません。

この場合、可読性が勝つはずです。

編集: とにかく、適切なインデントを使用する場合、2 つのバージョンの読みやすさの点で違いがありすぎるとは思いません。

new DoSomethingCmd(
    new SelectionContext(context, keys),
    infoStuff.getCurrentRole().getRole_id()
    ).execute(getResultContainer());

このテキストの利点は、不要になった変数 ( selectionContext, roleId) を定義していないことです (そのため、メソッドを再度読んだときに、より「永続的な」変数と混ざることはありません)。とにかく、それは解釈の余地があります。肝心なのは、そうする動機がない限り、最適化について心配する必要はないということです。

それとは別に、Java プログラミングには、本当に役立つ便利なトリックを提供するガイドラインがいくつかあります (vgStringBuilder文字列の連結に使用)。

于 2013-10-31T14:38:43.330 に答える
14

彼らがこれを主張するのは正しいですか?

いいえそうではありません。ローカル変数に何かを格納してから、そこから読み取るコストはほぼゼロです。これは単純なことです。これは、最適化に時間を費やしたり、心配したりする必要があるものではありませんすべてを非常に複雑な 1 行にまとめて読みやすさを犠牲にしないでください。

于 2013-10-31T14:36:41.050 に答える
11

人間の時間は、コンピューターの時間よりも何百万倍も高価です。

コードの行が、プログラマーが見るよりも何百万倍も実行されることが予想される場合は、おそらく最適化を検討する必要があります。しかし、確かにそれまでではありません。

それでも、あたかもコンパイラが愚かであるかのように最適化することはまったく無意味です。

忘れないで!時期尚早の最適化は諸悪の根源です

于 2013-10-31T14:42:26.050 に答える
3

最初のバージョンは、2 番目のバージョンよりもパフォーマンスがはるかに優れています。パフォーマンスの違いを確実に測定できるとは思えません。さらに、jit 最適化の後、結果のマシン コードは同じになるはずです。

于 2013-10-31T14:38:16.483 に答える
1

例に厳密に言えば、いいえ、 2つの間に測定可能な違いはありません(とにかく、最新のシステムではありません)。ただし、より少ないコードでより高いレベルで実行できることを実行するために、多くのより低いレベルのコードを作成することにより、パフォーマンスが大幅に向上することは非常に真実です。たとえば、多くの場合、配列を操作する方がコレクション API を使用するよりも高速です (それほど多くはないかもしれませんが、実際には高速です)。しかし、そうすることで可読性だけでなく保守性も失い、通常はパフォーマンスがわずかに向上します。

コードは常によく整理され、読みやすくなっている必要があります。優れたパフォーマンス メトリックを取得した後でのみ、パフォーマンスの向上のためにそれをあきらめることを検討する必要があります。

于 2013-10-31T14:49:56.057 に答える