Что лучше? Несколько операторов if или один if с несколькими условиями
для моей работы я должен разработать небольшое приложение Java, которое анализирует очень большие XML-файлы (~300k строк), чтобы выбрать очень конкретные данные (используя Pattern
), поэтому я пытаюсь немного оптимизировать его. Мне было интересно, что было лучше между этими 2 фрагментами:
if(boolean_condition && matcher.find(string))
{
...
}
или
if(boolean_condition)
{
if(matcher.find(string))
{
...
}
}
больше подробностей :
- эти операторы if выполняются на каждой итерации внутри цикла (~20k итераций)
- на
boolean_condition
is аboolean
рассчитывается на каждой итерации с использованием внешней функции - если
boolean
установлено значениеfalse
, мне не нужно тестировать регулярное выражение для матчей
Спасибо за помощь
8 ответов
одно золотое правило, которому я следую, - это Избежать Вложенности столько, сколько смогу. Но если это стоит того, чтобы сделать мое единственное условие if слишком сложным, я не против вложить его.
кроме того, вы используете короткого замыкания &&
оператора. Поэтому, если логическое значение false, оно даже не будет пытаться соответствовать!
и
if(boolean_condition && matcher.find(string))
{
...
}
- это путь!
следующие два метода:
public void oneIf(boolean a, boolean b)
{
if (a && b)
{
}
}
public void twoIfs(boolean a, boolean b)
{
if (a)
{
if (b)
{
}
}
}
создайте точно такой же байтовый код для тела метода, чтобы не было никакой разницы в производительности, что означает, что это чисто стилистический вопрос, который вы используете (лично я предпочитаю первый стиль).
оба способа в порядке, и второе условие не будет проверено, если первое является ложным.
используйте тот, который делает код более читаемым и понятным. Только для двух условий первый способ более логичен и удобочитаем. Это может быть не так больше с 5 или 6 условиями, связанными с &&
, ||
и !
.
Java использует короткое замыкание для этих булевых операторов, поэтому оба варианта функционально идентичны. Следовательно, если boolean_condition
имеет значение false, он не будет продолжать с
в конечном счете, это сводится к тому, что вам легче читать и отлаживать, но глубокая вложенность может стать громоздкой, если вы закончите с огромным количеством скобок в конце
один путь вы можете улучшить считываемость, если условие будет более длиной просто разделить его на несколько строк:
if(boolean_condition &&
matcher.find(string))
{
...
}
единственный выбор в этот момент - поместить && и | / в конец предыдущей строки или в начало текущего.
первый. Я стараюсь избегать, если вложенность такая, я думаю, что это плохой стиль/уродливый код, и && будет короткое замыкание и только тест с matcher.найти (), если логическое значение равно true.
С точки зрения производительности, они одинаковые.
- но даже если бы они не были
что почти наверняка доминирует во времени в этом коде, это matcher.find(string)
потому что это вызов функции.
Если вы хотите быть совместимым правило гидролокатора squid:S1066 вы должны свернуть операторы if, чтобы избежать предупреждения, так как он гласит:
складные операторы " if " должны быть объединены
Я склонен видеть слишком много && и/|, связанных вместе в логический суп и часто являются источником тонких ошибок.
слишком легко просто добавить еще один & & или || к тому, что вы считаете правильным местом и сломать существующую логику.
из-за этого, как правило, я стараюсь не использовать ни один из них, чтобы избежать соблазна добавить больше, поскольку требования меняются.