如何/为什么整数缓存在Java中更快?

时间:2015-10-03 03:24:08

标签: java performance caching autoboxing

根据Java语言规范,第5.1.7节,Java将 Integer 的缓存从-128到127进行性能优化。





因此,当您将 a == b a &进行比较时。 b 缓存范围内的整数,即使它们是不同的对象,它也会返回true。





从机制上讲,这种缓存带来了哪些性能优势?根据这个答案,“目的主要是节省内存,由于更好的缓存效率,这也可以带来更快的代码。 “它如何导致更快的代码?我如何使用此功能来提高我编写的实际代码的性能?





是否与 IntegerCache class?




  public static Integer valueOf(int i){
断言IntegerCache.high> = 127;
 if(i> = IntegerCache.low&& i< = IntegerCache.high)
 return IntegerCache.cache [i +( -  IntegerCache.low)];
返回new Integer(i);
}
  



1 个答案:

答案 0 :(得分:7)

性能优势与==无关。真正的原因是缓存允许valueOf避免在相同的"小"整数重复加框。 Integer个对象占用空间(至少16个字节)。创建大量垃圾收集器意味着垃圾收集器需要更频繁地运行。

我的理解是Java团队对实际应用程序进行了大量分析,得出的结论是Integer缓存是值得优化的。

(我说它与==无关的原因是你不能<{em>依赖 ==Integer个对象工作。因此,任何执行此操作的代码...还没有确保整数在指定范围内...是错误的。如果您进行范围检查以确保数字在范围内,您可能会花费更多使用==保存。)

  

&#34; ...由于更高的缓存效率,这也可以带来更快的代码。&#34;它如何导致更快的代码?

他们所讨论的缓存效率是大多数现代处理器用来处理CPU和内存速度不匹配的硬件级内存缓存。如果应用程序只有一个Integer对象表示数字1并且该数字经常出现,那么保存1对象的内存地址在(内存)缓存中的可能性会增加。缓存命中意味着更快的代码。

  

是否与IntegerCache类中的以下方法有关?

呃...是的。