首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >#ifdef # Java中的ifndef

#ifdef # Java中的ifndef
EN

Stack Overflow用户
提问于 2009-11-29 05:38:28
回答 7查看 77.6K关注 0票数 108

我怀疑是否有办法在Java语言中创建编译时条件,就像C++中的#ifdef #ifndef一样。

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

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

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

有人知道用Java做这件事的方法吗?或者,也许有人知道没有这样的方法(它也会很有用)。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-11-29 05:50:48

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编译器求值。这样做的开销可以忽略不计。

票数 128
EN

Stack Overflow用户

发布于 2009-11-29 05:49:44

javac不会输出无法访问的编译代码。对#define使用设置为常量值的最终变量,对#ifdef使用普通的if语句。

您可以使用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
票数 46
EN

Stack Overflow用户

发布于 2009-11-29 06:16:08

我想我已经找到了解决方案,它要简单得多。

如果我用"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++;
    }
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1813853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档