在64位虚拟机中,使用 longs 而不是整数在性能方面做得更好,因为java中的long是64位,因此拉动和处理64在64位系统中拉32位字时,位字可能更快。 (我期待很多NO,但我正在寻找详细的解释)。
编辑:我暗示“在64位系统中拉动和处理64位字可能比在32位字中拉32位字更快”,因为我假设在64位系统中,拉32位数据要求您先获取64位字,然后屏蔽前32位。
答案 0 :(得分:22)
long
使用int
可能会降低您的速度。
您最关心的是64位CPU上的int
是否需要额外的处理时间。这在现代流水线CPU上极不可能。我们可以通过一个小程序轻松测试。它运行的数据应该足够小,以适应L1缓存,以便我们测试这个特定的问题。在我的机器上(64位Intel Core2 Quad)基本上没有区别。
在真实应用中,大多数数据不能驻留在CPU缓存中。我们必须担心将数据从主内存加载到缓存,这是相对非常慢的,通常是瓶颈。这种加载工作在“缓存行”单元上,即64字节或更多,因此加载单个long
或int
将花费相同的时间。
然而,使用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实现,以及如何使用这些变量。但总的来说,担心可能没有足够的差异。