jut*_*tky 103 java conditional compilation conditional-compilation
我怀疑是否有一种方法可以在Java中创建编译时条件,如C++中的#ifdef #ifndef.
我的问题是有一个用Java编写的算法,我有不同的运行时间改进了该算法.所以我想测量每次改进时我节省了多少时间.
现在我有一组布尔变量,用于在运行时决定应该使用哪些改进,哪些不使用.但即使测试这些变量也会影响总运行时间.
所以我想找到一种方法来在编译期间决定编译和使用程序的哪些部分.
有人知道在Java中使用它的方法.或者也许有人知道没有这样的方式(它也会有用).
Mar*_*ton 122
private static final boolean enableFast = false;
// ...
if (enableFast) {
  // This is removed at compile time
}
如上所示的条件在编译时进行评估.相反,如果你使用它
private static final boolean enableFast = "true".equals(System.getProperty("fast"));
然后,任何依赖于enableFast的条件都将由JIT编译器进行评估.这个开销可以忽略不计.
Phi*_*oss 43
javac不会输出无法访问的编译代码.使用最终变量设置为您的常量值#define和.的正常if语句#ifdef.
您可以使用javap来证明输出类文件中不包含无法访问的代码.例如,请考虑以下代码:
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 给出以下输出,表明只编译了两个路径中的一个(并且if语句不是):
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
jut*_*tky 11
我认为我已经找到了解决方案,它更加简单.
如果我使用"final"修饰符定义布尔变量,Java编译器本身就可以解决问题.因为它事先知道测试这种情况的结果是什么.例如这段代码:
    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++;
    }
在我的电脑上运行大约3秒钟.
还有这个
    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++;
    }
跑了大约1秒钟.这段代码需要同样的时间
    int j=0;
    for(int i=0;i<1000000000;i++){
        j++;
    }
| 归档时间: | 
 | 
| 查看次数: | 68829 次 | 
| 最近记录: |