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,但我认为在这种情况下,两者之间的实际性能差异是无法测量的,