更具体地说,在Java中使用float而不是double时性能增益有多大?在什么情况下最好在Java中使用双精度浮点数?
回答
由于您的问题主要是关于性能,本文向您提供一些具体的计算(请记住,虽然这篇文章是针对神经网络,并且你的计算可能是什么他们在文章中做的)完全不同: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%。
通常,我会用一个double
,因为float
不具备的很多数值用例足够的精度和性能差异足够小并不重要。
与往常一样,性能依赖于实现,所以您需要针对您的特定情况进行基准测试,以确定它是否“重要”。
总的来说,我发现:
- 的性能差异的个体经营是非常小的,尤其是在64位机器。
float
和long
都适用于64位机器字。通常没有差别。 float
s有一个小优点,因为它们消耗较少的内存,这可以帮助减少CPU缓存压力。在大型阵列上进行简单操作时,我发现浮点数快30-50%。
有两个条件必须得到满足,以使用浮动而不是双:
- 有一个显著的,有用的性能增益。
- 浮点对于有问题的计算来说足够精确。
评估第一个条件相对简单和容易。使用双重测量工作。用相同的输入和其他条件再次测量,使用浮点数。浮点版本显着更快吗?通常,主要好处来自更高效地使用高速缓存,内存和数据传输带宽。
困难的部分是评估第二个条件。得不到准确的答案,甚至是错误的答案,都是无用的。对于许多计算来说,相对简单的分析可以显示出双倍的精确度。显示相同的浮动通常更困难。
你自己运行这些测试吗?如果有的话,我怀疑绩效的提高会更加微不足道。 – Gray
@Gray我到目前为止还没有在我自己的代码中使用'float'的好例子。我曾与一位客户合作,他在浮法数据处理方面获得了巨大收益,可以对非常大的地震数据阵列进行转换。增益来自更高效地使用I/O,内存,内存访问带宽和数据缓存。 –
为什么int
而不是long
?
为什么short
而不是int
?
为什么byte
而不是short
?
这是关于性能和内存使用的原因。理论上,更多的范围意味着更多的内存,更多的内存需要更多的硬件,这意味着更多的电池将被使用。
今天的机器具有原始类型的高性能。因此,毕竟,如果您使用long而不是double,反之亦然,您可能看不到任何区别,但Internet连接可能会因国家/地区而变慢,所以在此情况下最好使用float而不是double。
让我们来谈谈short
vs int
。
短期使用较少的内存比int
,但它需要被创建(Java)的30%以上的时间,所以会更好跳投使用int
,而不是short
?取决于具有100个short
的阵列将使用比100个阵列少得多的存储器。
与short
的循环可能比使用int
的循环更有效。
在互联网上,short
比int
效率更高,如果创建30%以上,doens无关紧要,带宽会很小,体验会更好。
我想让你只使用你需要的东西。记住:为什么80如果8可以做到这一点?
在java中的短将被自动转换为int。一个短的需要4个字节,就像一个int。 (阵列除外) – AlexWien
“硬件需要更多的内存,这意味着更多的电池将被使用” - 您确定?据我所知,内存使用量不会影响功耗。 0需要消耗大量能量作为1. –
@SteveKuo,从RAM中创建1000倍以上的需求,而不是创建1000个整数,这对功耗没有影响?即使两个商店都是0? –
大部分在没有CPU的嵌入式系统上进行快速双操作。例如导航系统,使用cpu密集计算。 但是在java中,许多数学库隐式地转换为double,所以在很多情况下使用float是没有意义的。
彩车需要一半的内存和优势,如果你有非常庞大的阵列和有限的内存(嵌入式设备)
- 1. 双精度和单精度浮点数?
- 2. Java中的双精度浮点型
- 3. 双精度浮点数和其他浮点数精度
- 4. OpenCL中最小/最大浮点数或双精度常数
- 5. c中的浮点数和双精度#
- 6. 爪哇 - 双精度浮点
- 7. 在没有FPU的情况下浮点数会发生什么?
- 8. 为什么在Java中允许双精度的任意精度?
- 9. 无法在Scala中写入双精度浮点和双精度浮点数的方法
- 10. 专门为双精度和浮点精度的java类
- 11. 为什么在C和C++中没有浮点/双精度的余数运算?
- 12. 将双精度转换为浮点数
- 13. Objective-C浮点数/双精度
- 14. 双精度浮点格式的最大和最小指数
- 15. 在非科学记号中打印浮点数或双精度浮点数
- 16. 将1234567.1234的双精度值转换为java中的浮点数
- 17. 这种情况下最好的情况是什么?
- 18. 为什么要在C#中使用浮点数或双精度时使用整数?
- 19. 在java中:有没有办法在不使用方法的情况下舍入一个双精度数?
- 20. 在JAVA双精度
- 21. 单精度大端浮点值到Python浮点数(双精度,大端)
- 22. 双精度浮点数如何转换为单精度浮点格式?
- 23. 双精度浮点值传递双精度时
- 24. Java使用浮点精度创建BufferedImage
- 25. 在什么情况下使用json_encode()比使用serialize()更好?
- 26. 标准双精度IEEE浮点数有多少位的精度?
- 27. 在MIPS中舍入双精度浮点数
- 28. FlockDB - 它是什么?最好的情况下使用
- 29. 使用ASP.Net,在这种情况下最好使用什么控件?
- 30. 为什么用零浮点(或双精度)数字除法不抛出java.lang.ArithmeticException:/在Java中为零
这取决于。与所有性能问题一样,**测量它。** –
我相信所有处理器在实际执行计算时都将浮点数视为双精度浮点数。唯一的区别是内存占用。 – nhgrif
谢谢 - 正是我正在寻找。 – Julian