我想使用BigDecimal来表示任意精度的数字,例如低延迟交易应用程序中的价格和金额,每秒有数千个订单和执行报告。
我不会对它们进行很多数学运算,所以问题不关乎BigDecimal本身的性能,而是关乎BigDecimal对象的数量会影响应用程序的性能。
我担心的是,大量短暂的BigDecimal对象会给GC造成压力,并导致CMS收集器中更大的Stop-The-World停顿-这绝对是我要避免的事情。
您能否确认我的担忧并建议使用BigD的替代方法?另外,如果您认为我的担心有误-请说明原因。
更新:
感谢所有回答。我现在确信使用BigDecimal会损害我的应用程序的延迟(即使我仍然打算对其进行衡量)。
目前,我们决定坚持使用“非常非OOP”解决方案(但不会降低准确性)-使用两个int
,一个用于尾数,另一个用于指数。其背后的理由是基元放置在堆栈上,而不是堆上,因此不受垃圾回收的影响。
最佳答案
如果您正在开发一个低延迟的交易程序,并且您确实想在延迟方面进行竞争,那么BigDecimal
不适合,就这么简单。在微秒很重要的地方,对象创建和任何十进制数学都太昂贵了。
我认为对几乎所有其他人来说,使用BigDecimal
都是一件容易的事,因为它对应用程序性能几乎没有可见的影响。
在做出延迟决定的延迟关键系统中,任何不可预测的垃圾收集暂停都完全无法解决,因此尽管当前的垃圾收集算法在正常使用中非常出色,但当延迟5毫秒时它们不一定适用花了你很多钱。我希望大型系统是以非常非OOP的风格编写的,除了某些内部字符串(用于代码等)之外,几乎没有使用任何对象。
当然,您肯定需要使用 double
(甚至是 float
)来提高准确性。
关于java - 使用BigDecimal如何影响应用程序性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1378044/