62

私の仕事では、非常に大きな XML ファイル (〜 300k 行) を解析して非常に特定のデータを選択する小さな Java アプリケーションを開発する必要があるため (を使用してPattern)、少し最適化しようとしています。これらの 2 つのスニペットのどちらが優れているのか疑問に思っていました。

if (boolean_condition && matcher.find(string)) {
    ...
}

また

if (boolean_condition) {
    if (matcher.find(string)) {
        ...
    }
}

その他の詳細:

  • これらの if ステートメントは、ループ内の各反復で実行されます (~20k 反復)
  • boolean_conditionboolean外部関数を使用して反復ごとに計算されます
  • booleanが に設定されている場合false、正規表現の一致をテストする必要はありません

ご協力いただきありがとうございます。

4

10 に答える 10

70

私が従う黄金律の 1 つは、できる限り「ネスティングを避ける」ことです。しかし、単一の if 条件が複雑になりすぎるという犠牲を払っている場合は、それを入れ子にしてもかまいません。

さらに、短絡&&演算子を使用しています。したがって、ブール値が false の場合、マッチングも試行されません!

そう、

if (boolean_condition && matcher.find(string)) {
    ...
}

行く方法です!

于 2011-03-10T13:02:12.123 に答える
23

次の 2 つの方法:

public void oneIf(boolean a, boolean b)
{
    if (a && b)
    {   
    }
}

public void twoIfs(boolean a, boolean b)
{
    if (a)
    {
        if (b)
        {       
        }
    }
}

メソッド本体にまったく同じバイトコードを生成するため、パフォーマンスの違いはありません。つまり、使用する純粋にスタイルの問題です(個人的には最初のスタイルが好きです)。

于 2011-03-10T13:11:05.067 に答える
6

どちらの方法でも問題ありません。最初の条件が false の場合、2 番目の条件はテストされません。

コードをより読みやすく理解しやすいものにするものを使用してください。条件が 2 つだけの場合は、最初の方法の方が論理的で読みやすいです。&&||およびにリンクされた 5 つまたは 6 つの条件では、もはやそうではない可能性があります!

于 2011-03-10T13:04:51.420 に答える
3

Java はこれらのブール演算子にショートサーキットを使用するため、両方のバリエーションは機能的に同一です。したがって、boolean_conditionが false の場合、マッチングに進みません。

最終的には、どちらが読みやすくデバッグしやすいかということになりますが、最後に大量の中かっこができてしまうと、深いネストが扱いにくくなる可能性があります

条件が長くなった場合に読みやすさを向上させる 1 つの方法は、単純に複数の行に分割することです。

if(boolean_condition &&
   matcher.find(string))
{
    ...
}

その時点での唯一の選択肢は、&& と || を配置するかどうかです。前の行の終わり、または現在の行の先頭。

于 2011-03-10T13:05:12.747 に答える
2

最初の1つ。そのようにネストする場合は避けようとします。スタイルが悪い/醜いコードだと思います.&&は短絡し、ブール値がtrueの場合にのみmatcher.find()でテストします。

于 2011-03-10T13:03:43.010 に答える
2

Sonar ルール squid:S1066に準拠したい場合は、if ステートメントを折りたたんで警告を回避する必要があります。

折りたたみ可能な「if」ステートメントはマージする必要があります

于 2017-03-27T15:44:26.023 に答える
1

パフォーマンスに関しては、それらは同じです。

  • しかし、そうではなかったとしても

このコードで時間の大半を占めるのはほぼ確実なのはmatcher.find(string)、関数呼び出しだからです。

于 2011-03-10T17:17:10.307 に答える