2016-12-01 17 views
1

私は例を示すために次の例を取っ​​ていますが、それは他のどのようなタスクでもよいことに注意してください。コードの長さはパフォーマンスに影響しますか?

String a=""; 
a="world"; 
Log.d("hello",a); 

String a=""; 
a="world"; 
Log.d("hello",a); 

String a="";  
a="world"; 
Log.d("hello",a); 

String a=""; 
a="world"; 
Log.d("hello",a); 

String a="";  
a="world"; 
Log.d("hello",a); 
... 
//1000 times 

for (int i =0; i< 1000; i++){  
    String a= "world"; 
    Log.d("hello",a); 
} 

のは、コンパイルされたプログラムの単なるパフォーマンスを読みやすさと、コードの品質を無視しましょう。 これはどちらが良いですか?

+0

総合的な答えは次のとおりです。 – biziclop

+2

はい、IOと比較されません。 – harold

+0

知りたい場合は、テストしてください。マイクロ最適化をコンパイラとランタイムに任せます。コードをコピー&ペーストしないでください。それ以外にも、実際のパフォーマンスの違いは重要ではありません。 – Jesper

答えて

0

プログラミング言語によって異なります。コンパイラは、低レベルでの繰り返し呼び出しを避けるような方法でコードを圧縮します。 Javaスクリプトのような言語によるオブジェクト指向プログラミングは比較的高いレベルにあり、コンパイルには時間がかかることがあります。

あなたの質問から推測して簡単にまとめると、コンパイルに要する全体的なファイルサイズと時間だけが影響します。

+2

質問は純粋にJavaに関するものです。他の言語や言語には依存しません。 –

4

唯一の答え:このはまったく問題ありません。

私は何を意味することは次のとおりです。側面は、このような可読性と良いデザインとしてのあなたの時間を費やしてずっとより価値があります。

優れたアプリケーションを設計するときにのみ、あなたはパフォーマンスの問題を抱えており、この特定の質問に目を通さなければならないでしょう。さて、それを調べることにメリットがあります。しかし、私は99.9%確信しています:あなたはこの時点ではありません。そしてその意味で、あなたはそのような考えであなたの時間を無駄にしています!

言い換えれば、特に「JVMスタック」には、パフォーマンスに微妙な影響を及ぼしたり、微妙な影響を与えるものがたくさんあります。同様に、ガベージコレクションの内部的な動作やジャストインタイムコンパイラの動作に影響を与える多くのオプションがあります。これは、ループコードを手動でアンロールするよりもはるかに重要な方法で、実行中のアプリケーションの「パフォーマンス」に影響を与えます。

そして記録のために、多くのベンチマーク実験は、あなたが "普通の"コードを与えた場合、JITはその最高の仕事をしていることを示しました。意味:Oracle JITは、「通常の」入力に対して「最良の結果」をもたらすように設計されています。しかし、あなたのJavaコードで何とか "最適化"されたコードを作成するためにはじめて、あなたの変更はそれをとすることです。JITが良い仕事をするためにはです。

したがって、このようなマイクロ最適化については忘れてください。あなたが "良いOO設計"と多分 "一般的なJavaのパフォーマンスの話題"について学ぶのと同じ時間を過ごすなら...あなたはそれからずっと多くを得るでしょう!

2

だからどちらが良いですか?

実際にはコンパイルされているため、最初のものです(2番目のタイプミスがあります)。非コンパイルコードは、最もパフォーマンスの低いコードです。

また、「可読性とコードの品質を無視する」と言っても、ほとんどの場合、可読性はパフォーマンスよりも重要です。読みやすさは、コードを実行する前に、まずコードを書く必要があります。

JITがループをアンロールするので、コードが実行されている特定のデータに対して、実行中の特定のJVMでパフォーマンスが向上していると判断します同じメッセージを何度も繰り返してログに記入するのは簡単ではありません)。

JITが適用される最適化を2番目に推測しないでください。最適化を自分で適用すると、パフォーマンスがになります。は、JITがコードを最適化するのが難しくなるためです。明確でメンテナンス可能なコードを書いて、JVMにその魔法を働かせてください。

0

あなたがやっていることを「ループアンローリング」といいます。

チェック:https://en.wikipedia.org/wiki/Loop_unrolling

これは、適切な最適化レベルでコンパイルされた場合、コンパイラがどうなる最適化の一つです。

私の見解では、2番目のオプションは最初のものより速く実行する必要があります。最初のオプションコードでは、ループカウンタをインクリメントする必要があるため、ループ条件と照合して適切な分岐判定を行います。分岐の誤予測があると、分岐そのものが高価になる可能性があります。これは、ブランチの誤予測CPUがすべてのpiplineをクリアして命令を再開する必要があるためです。チェック:https://en.wikipedia.org/wiki/Branch_misprediction

関連する問題