gpt4 book ai didi

java强制编译时评估

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:54 24 4
gpt4 key购买 nike

在java中,有没有一种通用的方法来强制执行编译时编译?在我参加的编程竞赛中,我们受到机器人在程序运行时每一轮可以使用的字节码的限制,所以如果我能够在编译时计算东西,我就有优势。

举个具体的例子,假设我想定义一个变量 NORTH,它将是一个数组MapLocations 表示机器人面向北方时可以看到的方 block 。如果我手动编写代码,我可以写:

public class SightSensor{
public static MapLocation[] NORTH = {new MapLocation(-2,2),
new MapLocation(-1,1),
new MapLocation(-1,2),
new MapLocation(0,1),
new MapLocation(0,2),
new MapLocation(0,3),
new MapLocation(1,1),
new MapLocation(1,2),
new MapLocation(2,2)};

表示机器人可以看到正北 90 度弧内距离 9 的平方内的所有方 block 。现在,我的机器人可以看到所有主要方向,有些可以看到更远的地方相对于其它的。尽可能地手工编写代码将是相当乏味且看似糟糕的形式视线(距离,方向)对。因此,我写了一个函数

public static MapLocation[] getSensorLocs(int r, Direction dir){ ... bla ... }

自动计算位置,因此我可以将 SightSensor 类重写为

public class SightSensor{
public static MapLocation[] NORTH = getSensorLocs(3, Direction.NORTH);
}

现在唯一的问题是当机器人尝试使用 NORTH 变量时,它必须花费运行 getSensorLocs 方法的时间,因此它比手写版本更昂贵。我可以强制该计算在编译时运行,即在适当的意义上进行“符号替换”吗?

最佳答案

现在我了解到您正在针对字节码大小进行优化,您可以使用以下方法。

// 8 bytes per field.
public static MapLocation[] NORTH = locations("\u006a\u0079\u007a\u0089\u008a\u008b\u0099\u009a\u009b\u00aa");

// 57 bytes.
public static MapLocation[] locations(String s) {
final int len = s.length();
MapLocation[] locations = new MapLocation[len];
for (int i = 0; i < len; i++) {
char ch = s.charAt(i);
locations[i] = new MapLocation((ch >> 4) - 8, (ch & 0xf) - 8);
}
return locations;
}

static class MapLocation {
public MapLocation(int x, int y) {
System.out.println("x=" + x + ", y=" + y);
}
}

打印

x=-2, y=2
x=-1, y=1
x=-1, y=2
x=0, y=1
x=0, y=2
x=0, y=3
x=1, y=1
x=1, y=2
x=1, y=3
x=2, y=2

注意:编码String的长度不加任何字节码!


当您运行第一段代码时,它实际上会在运行时创建数组和每个元素。没有编译时优化。我建议您检查您的 getSensorLocs 方法是否以及为什么变慢,因为它不应该慢很多。

关于java强制编译时评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8714706/

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