0

次の Java コードを検討してください。

public void DoStuff(String[] strings, boolean preEval)
{
    final String compareTo = "A Somewhat Long String of Characters";

    for ( int i = 0; i < strings.length; ++i )
    {
         if ( preEval )
         {
              if( strings[i].equals(compareTo) )
              {
                  //do something process intensive
              }
         }

         //do something process intensive
    }

}

if (preEval)ここで、その中の内側のステートメントに注意を払います。使用中のアルゴリズムが preEval などの条件を必要とする場合、preEvalコードの最適化のために条件を含めることは理にかなっていますか?

私の理解では、条件付きフラグが true または false に解決されるかどうかを評価することは、文字のコレクションを繰り返し処理し、そのコレクション内の各文字を別のコレクションの対応する別の文字と比較するよりもはるかに高速です。

アセンブリに関する私の知識は、関連する内部およびオペコード/ニーモニックに関して言えば約 30% であるため、なぜこの質問をしているのか.

アップデート

注:ここに掲載されているコードは、言語に依存しないことを意図しています。私が Java を選んだのは、具体的で読みやすいものと、プログラマー コミュニティで広く知られているもののためだけです。

4

2 に答える 2

1

ほとんどの場合、これはおそらく最適化だと思います。

とはいえ、測定されていないコードの最適化に時間を費やすべきではありません。

たとえば、次の場合、これは価値のある最適化ではない可能性があります。

  • ほとんどの場合、文字列が少ないか、非常に短い文字列が含まれます。
  • 関数を呼び出す前にpreEvalパラメーターを計算するのに長い時間がかかります。

現実的な状況でコードを測定し、ボトルネックを特定してから、最適化します。

于 2012-08-22T22:01:03.660 に答える
0

HashSet::contains(string) メソッドを使用して、コレクション内に文字列が存在するかどうかを確認するのが、より安価な方法です。おそらく、文字列の HashSet または文字列をキーとする HashMap を使用して反復する際に、文字列比較の必要性をなくすように設計できます。

私は常に、条件付きロジックを完全に回避できる HashMap を使用しようとしています。

_ryan

于 2012-08-22T21:36:50.310 に答える