2014-01-30 30 views
8

更具体地说,在Java中使用float而不是double时性能增益有多大?在什么情况下最好在Java中使用双精度浮点数?

+0

这取决于。与所有性能问题一样,**测量它。** –

+0

我相信所有处理器在实际执行计算时都将浮点数视为双精度浮点数。唯一的区别是内存占用。 – nhgrif

+0

谢谢 - 正是我正在寻找。 – Julian

回答

5

由于您的问题主要是关于性能,本文向您提供一些具体的计算(请记住,虽然这篇文章是针对神经网络,并且你的计算可能是什么他们在文章中做的)完全不同:http://web.archive.org/web/20150310213841/http://www.heatonresearch.com/content/choosing-between-java%E2%80%99s-float-and-double

一些从链接的相关材料转载于此:

double和float都可以支持相对较大的数字。较高的 和较低的范围对于神经网络来说确实不是一个考虑因素。 浮动可以处理1.40129846432481707e-45到 之间的数字3.40282346638528860e + 38 ...基本上,浮动可以处理约7位小数。一个double可以处理16个小数位。

矩阵乘法是神经网络编程中最常用的数学运算 之一。绝不是唯一的操作,但它将提供一个很好的基准。以下程序 将用于基准测试双。

跳过所有代码,网站上的表格显示,对于100x100矩阵乘法,如果他们使用双打,他们的性能增益约为10%。对于500x100的矩阵乘法,由于使用双打导致的性能损失约为7%。而对于1000x1000的矩阵乘法,该损失约为17%。

对于小的100x100矩阵切换浮动实际上可能会降低 的性能。随着矩阵的大小增加,增加的百分比增加。使用非常大的矩阵时,性能增益会增加到17%。值得考虑的是17%。

9

通常,我会用一个double,因为float不具备的很多数值用例足够的精度和性能差异足够小并不重要。

与往常一样,性能依赖于实现,所以您需要针对您的特定情况进行基准测试,以确定它是否“重要”。

总的来说,我发现:

  • 的性能差异的个体经营是非常小的,尤其是在64位机器。 floatlong都适用于64位机器字。通常没有差别。
  • float s有一个小优点,因为它们消耗较少的内存,这可以帮助减少CPU缓存压力。在大型阵列上进行简单操作时,我发现浮点数快30-50%。
+0

64位或32位机器的这些性能提升?什么大小的数组? – Gray

+1

@Gray我认为这个增益可以在32位和64位系统上实现,因为L1缓存(和其他)可以包含两倍以上的浮点数。因此,我们可以通过减少内存查找延迟来实现性能提升。但是(IMO)java的libs被设计为更常用于双打(在许多操作中是双投),这就是为什么我们无法看到每次我们将所有双打都改为在源代码中浮动时性能的增加。 – Dmitry

0

有两个条件必须得到满足,以使用浮动而不是双:

  1. 有一个显著的,有用的性能增益。
  2. 浮点对于有问题的计算来说足够精确。

评估第一个条件相对简单和容易。使用双重测量工作。用相同的输入和其他条件再次测量,使用浮点数。浮点版本显着更快吗?通常,主要好处来自更高效地使用高速缓存,内存和数据传输带宽。

困难的部分是评估第二个条件。得不到准确的答案,甚至是错误的答案,都是无用的。对于许多计算来说,相对简单的分析可以显示出双倍的精确度。显示相同的浮动通常更困难。

+0

你自己运行这些测试吗?如果有的话,我怀疑绩效的提高会更加微不足道。 – Gray

+0

@Gray我到目前为止还没有在我自己的代码中使用'float'的好例子。我曾与一位客户合作,他在浮法数据处理方面获得了巨大收益,可以对非常大的地震数据阵列进行转换。增益来自更高效地使用I/O,内存,内存访问带宽和数据缓存。 –

2

为什么int而不是long

为什么short而不是int

为什么byte而不是short

这是关于性能和内存使用的原因。理论上,更多的范围意味着更多的内存,更多的内存需要更多的硬件,这意味着更多的电池将被使用。

今天的机器具有原始类型的高性能。因此,毕竟,如果您使用long而不是double,反之亦然,您可能看不到任何区别,但Internet连接可能会因国家/地区而变慢,所以在此情况下最好使用float而不是double。

让我们来谈谈short vs int

短期使用较少的内存比int,但它需要被创建(Java)的30%以上的时间,所以会更好跳投使用int,而不是short?取决于具有100个short的阵列将使用比100个阵列少得多的存储器。

short的循环可能比使用int的循环更有效。

在互联网上,shortint效率更高,如果创建30%以上,doens无关紧要,带宽会很小,体验会更好。

我想让你只使用你需要的东西。记住:为什么80如果8可以做到这一点?

+0

在java中的短将被自动转换为int。一个短的需要4个字节,就像一个int。 (阵列除外) – AlexWien

+2

“硬件需要更多的内存,这意味着更多的电池将被使用” - 您确定?据我所知,内存使用量不会影响功耗。 0需要消耗大量能量作为1. –

+0

@SteveKuo,从RAM中创建1000倍以上的需求,而不是创建1000个整数,这对功耗没有影响?即使两个商店都是0? –

1

大部分在没有CPU的嵌入式系统上进行快速双操作。例如导航系统,使用cpu密集计算。 但是在java中,许多数学库隐式地转换为double,所以在很多情况下使用float是没有意义的。

彩车需要一半的内存和优势,如果你有非常庞大的阵列和有限的内存(嵌入式设备)

相关问题