我怀疑是否有一种方法可以在Java中创建编译时条件,例如C ++中的#ifdef #ifndef。
我的问题是,有一种用Java编写的算法,并且对该算法的运行时间有所不同。因此,我想衡量每次使用改进后可以节省多少时间。
现在,我有一组布尔变量,这些布尔变量用于确定在运行时应该使用哪个改进,而不应该使用哪个改进。但是即使测试这些变量也会影响总运行时间。
因此,我想找到一种方法来确定在编译期间应编译和使用程序的哪些部分。
有人知道用Java做到这一点的方法吗?或者,也许有人知道没有这种方法(这也很有用)。
private static final boolean enableFast = false;
// ...
if (enableFast) {
// This is removed at compile time
}
上面显示的条件在编译时进行评估。如果相反,你使用此
private static final boolean enableFast = "true".equals(System.getProperty("fast"));
然后,JIT编译器将评估任何依赖enableFast的条件。这样的开销可以忽略不计。
这个解决方案比我的更好。当我尝试使用预设的外部值初始化变量时,运行时间回到了3秒。但是,当我将变量定义为静态类变量(而不是函数局部变量)时,运行时间恢复为1秒。谢谢您的帮助。
IIRC,甚至在Java使用JIT编译器之前就可以使用。
javac
我认为该代码已删除。仅当(say)的表达式enableFast
是编译时常量表达式时,此方法才有效。是的,但是这个条件必须存在于方法中,对吗?如果我们要设置一堆私有的静态最终字符串,那该怎么办呢?(例如,针对生产和登台设置不同的一组服务器URL)
@tomwhipple:是的,再加上这不允许您做类似的事情:
private void foo(#ifdef DEBUG DebugClass obj #else ReleaseClass obj #endif )
导入(例如,关于类路径)又如何呢?