Java autobox作为原始文本是否存在性能成本?

Java autobox作为原始文本是否存在性能成本?,java,boxing,autoboxing,Java,Boxing,Autoboxing,假设我有以下代码: Map<String, Boolean> map = ... map.put("foo", true); Map=。。。 map.put(“foo”,true); 从理论上讲,true必须自动装箱,与插入Boolean.true相比,会产生轻微的性能影响。但是,既然我们处理的是一个文本值,那么编译器是否可以用一个装箱文本替换原始文本,这样就不会有额外的运行时开销 在任何人攻击我之前,为了代码的清晰性,我通常会选择原语文字,即使性能成本很小。这个问题主要是理论性

假设我有以下代码:

Map<String, Boolean> map = ...
map.put("foo", true);
Map=。。。
map.put(“foo”,true);
从理论上讲,
true
必须自动装箱,与插入
Boolean.true
相比,会产生轻微的性能影响。但是,既然我们处理的是一个文本值,那么编译器是否可以用一个装箱文本替换原始文本,这样就不会有额外的运行时开销


在任何人攻击我之前,为了代码的清晰性,我通常会选择原语文字,即使性能成本很小。这个问题主要是理论性的。

是的,性能受到了轻微的影响。为了装箱原语,使用包装器类型的
valueOf()
方法。因为这是一种非常简单的方法,用于
布尔
返回x?TRUE:FALSE;
),JIT可能能够有效地内联结果;但是,目前Java编译器没有。(JLS不需要使用
valueOf()
,因此可以引入
Boolean
优化。)

对于其他类型,它更复杂。例如,
Integer
返回接近零的值的缓存实例,并为更大的值创建新实例。仍然可以执行优化,但分配新实例总是需要一些时间


作为对评论的回应,让我集中谈谈我认为问题的关键点:

因为我们处理的是一个文本值,编译器是否可以用一个装箱的文本替换原始文本

是的,这是可能的,但不可能,Oracle
javac
编译器不这样做


这有关系吗?不,装箱到
布尔值
的性能影响非常小;使用与其他原语相同的
valueOf()
技术装箱
boolean
对于编译器来说是一个安全而明智的选择。

理解任何性能相关问题的关键总是从测试开始。若要改进您的问题,请显示一个给出性能分析结果的计时测试。例如,您可以编写一个计时For循环,将100K个条目放入一个映射中,并打印所花的时间,并对
map的不同参数执行相同的操作<代码>map.put(“foo”,Boolean.TRUE)@ElliottFrisch我知道。我的问题是它是否会有帮助。@assylias这是一个为你量身定做的问题;通过显示字节码。@bohemian在我的手机上没有字节码分析器-真是太遗憾了…如果JIT不能内联它并使两个选项本质上相等,我会感到惊讶。你的第一句话可能太直截了当了…@assylias我也会感到惊讶,但这会发生在第一次跑步时吗?即使这样,与使用
Boolean.TRUE
而不是
TRUE
的代码相比,优化过程会花费额外的时间吗?我认为关键的一点是,每当必须分配新对象时,主要的性能影响就会出现。对于Boolean.valueOf(),永远不会分配新对象。代码确实应该使用类常量Boolean.TRUE,而不是Boolean原语literal,但我认为在这种情况下,两者之间的实际性能差异是无法测量的,