问题
For my work I have to develop a small Java application that parses very large XML files (~300k lines) to select very specific data (using Pattern
), so I\'m trying to optimize it a little. I was wondering what was better between these 2 snippets :
if(boolean_condition && matcher.find(string))
{
...
}
OR
if(boolean_condition)
{
if(matcher.find(string))
{
...
}
}
More precisions :
- These if statements are executed on each iteration inside a loop (~20k iterations)
- The
boolean_condition
is aboolean
calculated on each iteration using an external function - If the
boolean
is set tofalse
, I don\'t need to test the regular expression for matches
Thanks for your help
回答1:
One golden rule I follow is to Avoid Nesting as much as I can. But if it is at the cost of making my single if condition too complex, I don't mind nesting it out.
Besides you're using the short-circuit &&
operator. So if the boolean is false, it won't even try matching!
So,
if(boolean_condition && matcher.find(string))
{
...
}
is the way to go!
回答2:
The following two methods:
public void oneIf(boolean a, boolean b)
{
if (a && b)
{
}
}
public void twoIfs(boolean a, boolean b)
{
if (a)
{
if (b)
{
}
}
}
produce the exact same byte code for the method body so there won't be any performance difference meaning it is purely a stylistic matter which you use (personally I prefer the first style).
回答3:
Both ways are OK, and the second condition won't be tested if the first one is false.
Use the one that makes the code the more readable and understandable. For just two conditions, the first way is more logical and readable. It might not be the case anymore with 5 or 6 conditions linked with &&
, ||
and !
.
回答4:
Java uses short-circuiting for those boolean operators, so both variations are functionally identical. Therefore, if the boolean_condition
is false, it will not continue on to the matching
Ultimately, it comes down to which you find easier to read and debug, but deep nesting can become unwieldy if you end up with a massive amount of braces at the end
One way you can improve the readability, should the condition become longer is to simply split it onto multiple lines:
if(boolean_condition &&
matcher.find(string))
{
...
}
The only choice at that point is whether to put the && and || at the end of the previous line, or the start of the current.
回答5:
The first one. I try to avoid if nesting like that, i think it's poor style/ugly code and the && will shortcircuit and only test with matcher.find() if the boolean is true.
回答6:
In terms of performance, they're the same.
- But even if they weren't
what's almost certain to dominate the time in this code is matcher.find(string)
because it's a function call.
回答7:
I tend to see too many && and || strung together into a logic soup and are often the source of subtle bugs.
It is too easy to just add another && or || to what you think is the right spot and break existing logic.
Because of this as a general rule i try not to use either of them to avoid the temptation of adding more as requirements change.
回答8:
If you like to be compliant to Sonar rule squid:S1066 you should collapse if statements to avoid warning since it states:
Collapsible "if" statements should be merged
来源:https://stackoverflow.com/questions/5259938/what-is-better-multiple-if-statements-or-one-if-with-multiple-conditions