在64位java中使用long而不是int会有好处

时间:2011-08-01 19:18:30

标签: java performance io 64-bit

在64位虚拟机中,使用 longs 而不是整数在性能方面做得更好,因为java中的long是64位,因此拉动和处理64在64位系统中拉32位字时,位字可能更快。 (我期待很多NO,但我正在寻找详细的解释)。

编辑:我暗示“在64位系统中拉动和处理64位字可能比在32位字中拉32位字更快”,因为我假设在64位系统中,拉32位数据要求您先获取64位字,然后屏蔽前32位。

3 个答案:

答案 0 :(得分:22)

long使用int可能会降低您的速度。

您最关心的是64位CPU上的int是否需要额外的处理时间。这在现代流水线CPU上极不可能。我们可以通过一个小程序轻松测试。它运行的数据应该足够小,以适应L1缓存,以便我们测试这个特定的问题。在我的机器上(64位Intel Core2 Quad)基本上没有区别。

在真实应用中,大多数数据不能驻留在CPU缓存中。我们必须担心将数据从主内存加载到缓存,这是相对非常慢的,通常是瓶颈。这种加载工作在“缓存行”单元上,即64字节或更多,因此加载单个longint将花费相同的时间。

然而,使用long将浪费宝贵的缓存空间,因此缓存未命中将增加,这非常昂贵。 Java的堆空间也很紧张,因此GC活动会增加。

我们可以通过阅读具有相同数量元素的巨大long[]int[]数组来证明这一点。它们比缓存可以包含的更大。长版本在我的机器上花费的时间多65%。测试受内存 - >高速缓存的吞吐量限制,并且long []内存量大100%。 (为什么不花100%的时间超出我的时间;显然其他因素也在发挥作用)

答案 1 :(得分:4)

我总是使用基于您的问题域的正确的数据类型

我的意思是,如果你需要64位长,那么使用64位长,但如果你不需要64位长,那么使用int。

在64位平台上使用32位并不昂贵,根据性能进行比较是没有意义的。

对我而言,这看起来不正确:

for(long l = 0; l<100; l++)
 //SendToTheMoon(l);

SendToTheMoon与此无关。

答案 2 :(得分:1)

可能会更快,可能会更慢。取决于具体的Java实现,以及如何使用这些变量。但总的来说,担心可能没有足够的差异。