为了账号安全,请及时绑定邮箱和手机立即绑定

Java中的#ifdef #ifndef

Java中的#ifdef #ifndef

心有法竹 2019-08-17 15:06:30
Java中的#ifdef #ifndef我怀疑是否有一种方法可以在Java中创建编译时条件,如C ++中的#ifdef #ifndef。我的问题是有一个用Java编写的算法,我有不同的运行时间改进了该算法。所以我想测量每次改进时我节省了多少时间。现在我有一组布尔变量,用于在运行时决定应该使用哪些改进,哪些不使用。但即使测试这些变量也会影响总运行时间。所以我想找到一种方法来在编译期间决定编译和使用程序的哪些部分。有人知道在Java中使用它的方法。或者也许有人知道没有这样的方式(它也会有用)。
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

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


查看完整回答
反对 回复 2019-08-17
?
函数式编程

TA贡献1807条经验 获得超9个赞

我认为我已经找到了解决方案,它更加简单。
如果我使用“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++;
    }


查看完整回答
反对 回复 2019-08-17
  • 3 回答
  • 0 关注
  • 672 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号