【发布时间】:2011-12-12 22:43:40
【问题描述】:
我正在做一个项目,我们正在生产一种可编译为 java 的语言。我们使用的框架 (xtext) 在其生成的代码中大量使用了装箱。 具体来说,如果你有这样的声明:
int i = 1;
int j = 2;
int k = i + j;
那么编译后的代码如下:
IntegerExtensions.operator_plus(((Integer)i), ((Integer)j))
现在,在我正在进行的项目中,在某些情况下,特定的基本二进制操作将非常普遍(尤其是增量和比较)。
我的问题是:这会是性能方面的问题,还是 JIT(或类似智能 JVM 功能)会简单地意识到发生了什么并解决所有问题?
发帖前请阅读:我不想收到回复说“你不应该关心,让它可读”。这段代码是生成的,我根本不关心生成代码的可读性。我真正关心的是我们不会因此而对性能造成重大影响。
谢谢
【问题讨论】:
-
你说编译后的代码,是指编译进你的框架还是编译成字节码?
-
拳击比不拳击贵。有关系吗? (这是这里唯一真正的问题。)嗯,“这取决于”...另外,为什么编译后的代码看起来像这样? :) 有一个iadd native java 字节码...
-
@glowcodeer:当我说编译代码时,我的意思是从我的语言中提取并编译成 .java 文件。
-
@pst:我不确定为什么代码看起来像这样,但我假设在一般情况下它背后有某种原因。至于“这有关系吗?”,这实际上不是问题——问题是“它总是更贵吗?” - 看看我提到的即时编译,以及我对约翰回答的评论。
-
@Jeff 具体答案仍然是:“可能是”,一般答案是“视情况而定”。仅仅因为不一定创建新对象并不意味着它在字节码 或 JIT 代码中具有相同的路径。找到一个病态的理想案例,说明它在哪里被有效地 JIT 删除了——假设存在这样的案例——并没有帮助。只有复制真实用法的性能分析才能“正确”回答这个问题。
标签: java performance jit boxing xtext