#ifdef #ifndef in Java
private static final boolean enableFast = false;// ...if (enableFast) { // This is removed at compile time}
Conditionals like that shown above are evaluated at compile time. If instead you use this
private static final boolean enableFast = "true".equals(System.getProperty("fast"));
Then any conditions dependent on enableFast will be evaluated by the JIT compiler. The overhead for this is negligible.
javac will not output compiled code that is unreachable. Use a final variable set to a constant value for your #define
and a normal if
statement for the #ifdef
.
You can use javap to prove that the unreachable code isn't included in the output class file. For example, consider the following code:
public class Test{ private static final boolean debug = false; public static void main(String[] args) { if (debug) { System.out.println("debug was enabled"); } else { System.out.println("debug was not enabled"); } }}
javap -c Test
gives the following output, indicating that only one of the two paths was compiled in (and the if statement wasn't):
public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String debug was not enabled 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return
I think that I've found the solution, It's much simpler.
If I define the boolean variables with "final" modifier Java compiler itself solves the problem. Because it knows in advance what would be the result of testing this condition.For example this code:
boolean flag1 = true; boolean flag2 = false; int j=0; for(int i=0;i<1000000000;i++){ if(flag1) if(flag2) j++; else j++; else if(flag2) j++; else j++; }
runs about 3 seconds on my computer.
And this one
final boolean flag1 = true; final boolean flag2 = false; int j=0; for(int i=0;i<1000000000;i++){ if(flag1) if(flag2) j++; else j++; else if(flag2) j++; else j++; }
runs about 1 second. The same time this code takes
int j=0; for(int i=0;i<1000000000;i++){ j++; }