我怀疑是否有办法在Java语言中创建编译时条件,就像C++中的#ifdef #ifndef一样。
我的问题是有一个用Java编写的算法,并且我对该算法有不同的运行时间改进。因此,我想衡量每次使用改进时,我节省了多少时间。
现在,我有一组布尔变量,用于在运行时决定哪些改进应该使用,哪些不应该。但是,即使测试这些变量也会影响总运行时间。
所以我想找出一种方法,在编译期间决定应该编译和使用程序的哪些部分。
有人知道用Java做这件事的方法吗?或者,也许有人知道没有这样的方法(它也会很有用)。
发布于 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编译器求值。这样做的开销可以忽略不计。
发布于 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
发布于 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++;
}
https://stackoverflow.com/questions/1813853
复制相似问题