6

簡単な質問かもしれませんが、私は混乱しています

どのコードが最適化されていますか? そして、私は使用する必要がありますか?

内部プロセスの違いは何ですか?

String str = editText.getText().toString();     
str =str.trim().toLowerCase();
textView.setText(str);

textView.setText(editText.getText().toString().trim().toLowerCase());
4

6 に答える 6

4

ステートメントを複数行に分割するよりも、すべてを 1 行にまとめたほうがよいとは思わないでください。一般に、Java コンパイラは、どちらの場合でもまったく同じバイトコードを生成できるほどスマートです。最新のコンパイラは、多くのマイクロ最適化を行います。

それらをコンパイルして違いがあるかどうかを確認してから、コマンドでバイトコードを逆コンパイルしjavap -cます。

編集 :

テストしたところ、結果は次のとおりです。

String str = editText.getText().toString();     
str = str.trim().toLowerCase();
textView.setText(str);

コンパイルすると:

       0: aload_0       
       1: getfield      #7                  // Field textView:Landroid/widget/TextView;
       4: aload_0       
       5: getfield      #4                  // Field editText:Landroid/widget/EditText;
       8: invokevirtual #8                  // Method android/widget/EditText.getText:()Landroid/text/Editable;
      11: invokevirtual #9                  // Method java/lang/Object.toString:()Ljava/lang/String;
      14: invokevirtual #10                 // Method java/lang/String.trim:()Ljava/lang/String;
      17: invokevirtual #11                 // Method java/lang/String.toLowerCase:()Ljava/lang/String;
      20: invokevirtual #12                 // Method android/widget/TextView.setText:(Ljava/lang/CharSequence;)V
      23: return        

そして2番目のもの:

textView.setText(editText.getText().toString().trim().toLowerCase());

次の結果が得られます。

       0: aload_0       
       1: getfield      #7                  // Field textView:Landroid/widget/TextView;
       4: aload_0       
       5: getfield      #4                  // Field editText:Landroid/widget/EditText;
       8: invokevirtual #8                  // Method android/widget/EditText.getText:()Landroid/text/Editable;
      11: invokevirtual #9                  // Method java/lang/Object.toString:()Ljava/lang/String;
      14: invokevirtual #10                 // Method java/lang/String.trim:()Ljava/lang/String;
      17: invokevirtual #11                 // Method java/lang/String.toLowerCase:()Ljava/lang/String;
      20: invokevirtual #12                 // Method android/widget/TextView.setText:(Ljava/lang/CharSequence;)V
      23: return        

ご覧のとおり、私が正しく推測したように、それらは同一です。Java コンパイラは最初の例を最適化し、変数が役に立たないため完全に削除しました。

したがって、結論は、より読みやすいコードを使用する必要があるということです。

于 2012-07-28T09:32:23.190 に答える
2

[1]文字列 strの作成はデバイスのメモリを占有します.しかし後で使うこともできます; したがって、後で必要になった場合は最適化されます。

[2]メモリを使用しないため、単純に最適化されていますが、後でこの文字列が必要になると、常にフェッチする必要があるため、プロセスを完了するのにより多くのマシン サイクルが必要になります。その場合、2 番目の文字列はあまり最適化されていません。 .

于 2012-07-28T09:23:17.320 に答える
1

ここでは、最初に出力を文字列変数に保存して、そのためのスペースを占有してから、小文字に変換してテキストビューに設定します。

そして2番目のオプションでは、変数に保存せずにテキストビューに設定します。

したがって、それ以降のコーディングで使用したくない場合は、2 番目のオプションをお勧めします。

于 2012-07-28T09:19:12.113 に答える
1

最初のものでは追加の変数を使用し、2番目のものよりも多くのメモリを使用します。秒がメモリ効率の利点がある限り

于 2012-07-28T09:47:05.393 に答える
-1

2 つ目は、メモリ効率が高いという利点がありますが、読みにくくなっています。オブジェクトに参照変数を割り当てないと、ガベージ コレクションの対象になりやすくなります。

しかし、言うまでもなく、そのような小さな最適化よりも読みやすさを優先する必要があります。

于 2012-07-28T09:26:03.810 に答える
-2

最初に追加の変数を使用しているため、2 番目の変数よりも多くのメモリが必要です。

于 2012-07-28T09:20:05.443 に答える