gpt4 book ai didi

java - Java 中提供编译时代码变体的任何机制?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:11:12 24 4
gpt4 key购买 nike

我正在为 Java 中的数据结构编写一组可视化界面。这个想法是,这些类应该是算法的高性能实现,但带有嵌入式 Hook ,以便可以交互地显示算法。

这样做的原因有很多,但如果您接受这个请求的表面值(value),我想在算法中间嵌入调用以识别刚刚完成的特定小节。例如,一次排序算法。

我希望图书馆既高效又允许这样做。在 C++ 中,我会插入两个不同的模板或使用条件编译,并且可以合理地生成两个版本的代码。有什么办法可以在 Java 中实现这一点?我希望其他人可以想出一个,因为我做不到。

快讯。我试过这段实际代码。

对于 n=100,000,将 VISUALIZE 作为静态变量但不是最终变量时,插入排序大约需要 9800 毫秒,而将其注释掉时大约需要 3100 毫秒。所以性能损失是 Not Acceptable 。

可视化为 static final 时,优化器确实会检测到它并将其删除,但鉴于它是 final,我能用它做什么呢?我无法动态打开和关闭可视化!

public class TestSort {
private static boolean VISUALIZE = false;
private static ArrayObserver ao;
public static void insertionSort(int[] x) {
for (int i = 1; i < x.length; i++) {
int temp = x[i];
int j = i - 1;
if (x[j] > temp) {
do {
x[j+1] = x[j];
/* if (VISUALIZE) {
ao.compare(i-1, i);
ao.copy(i-1, i);
}*/
} while (--j >= 0 && x[j] > temp);
x[j+1] = temp;
}
}
}
static Random r = new Random();
static int[] createRandomArray(int n) {
int[] x = new int[n];
for (int i = 0; i < x.length; i++)
x[i] = r.nextInt(100);
return x;
}
static void display(int[] x) {
for (int i = 0; i < x.length; i++)
System.out.print(x[i] + " ");
System.out.println();
}
public static void main(String args[]) {
//int[] x = {9, 8, 7, 6, 5, 4, 3, 2, 1};
int [] x = createRandomArray(100000);
ao = new ArrayObserver(x);
if (x.length < 20) display(x);
long t0 = System.currentTimeMillis();
insertionSort(x);
long t1 = System.currentTimeMillis();
if (x.length < 20) display(x);
System.out.println(t1-t0);
}
}

最佳答案

我想你有几个选择:

  • static final 常量(例如 boolean 值)进行测试,该常量有条件地执行可视化界面代码。当您将常量设置为“关闭”时,JVM 将消除死代码,并且您的代码将得到全面优化。当然,缺点是您只能在编译时切换它,但如果您真的想构建库的两个副本,这可能没问题。
  • 向确定是否调用可视化界面的函数添加一个额外参数,并在您的算法中根据需要对其进行测试。这将增加少量的运行时开销,但很可能是可以接受的。我建议你对此进行基准测试,根据我的经验,虽然对局部变量的此类测试通常足够便宜,你可以摆脱它(就 CPU 而言,可能只是一个寄存器测试,它可能比成本更便宜对 int[] 数组的单个内存访问......)
  • 使用更高级别/元语言来表达算法,并使用代码生成技术来生成您需要的实际代码(有或没有)。例如,我在 Clojure 中做过类似的事情。也可以选择使用 ASM 等工具直接生成字节码(如果您只关心执行,不需要 Java 源代码)。
  • 使用文本预处理器。它应该可以很好地生成 Java 代码(就像生成 C/C++ 一样),尽管这不是一种常见的方法,而且您可能会发现它有点脆弱。您可能需要做一些聪明的事情,例如在文件系统中生成不同的类名等。

关于java - Java 中提供编译时代码变体的任何机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20559708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com