#ifdef #ifndef在 Java 中

我怀疑是否有一种方法可以在Java中像C++中的#ifdef #ifndef那样创建编译时条件。

我的问题是,有一个用Java编写的算法,并且我对该算法有不同的运行时间改进。因此,我想衡量一下使用每个改进时我节省了多少时间。

现在我有一组布尔变量,用于在运行时决定哪些改进应该使用,哪些不应该。但即使测试这些变量也会影响总运行时间。

因此,我想找到一种方法来决定在编译期间应该编译和使用程序的哪些部分。

有人知道在Java中做到这一点的方法吗?或者也许有人知道没有这样的方式(它也很有用)。


答案 1
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 编译器进行评估。这样做的开销可以忽略不计。


答案 2

javac 不会输出无法访问的已编译代码。使用设置为 常量值的最后一个变量作为 your 的常量值和 .#defineif#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

推荐