我想使用的BigDecimal表示任意精度的数字一样的价格,并与成千上万的订单和每秒执行报告的低延迟交易应用金额。

我不会做对他们的许多数学运算,所以问题不是关于BigDecimal本身的性能,而是如何大BigDecimal对象的体积会影响应用程序的性能。

我担心的是,短暂的BigDecimal对象的大量会把应变上的GC和造成更大停止这世界停留在CMS集电极 - 这绝对是我想什么,以避免

能否请你确认我的关注,并提出其他建议使用BigD?另外,如果你认为我的担忧是错误的 - 请解释为什么

<强>更新

感谢所有谁回答。我现在确信,使用的BigDecimal会伤害我的应用程序(尽管我仍不打算来衡量它)。

的延迟

有关暂时我们决定坚持用“非常不OOP”的解决方案(但没有命中精度) - 使用两个ints,一个尾数,另一个用于指数。这背后的理由是,基元放置在栈,堆不,因此不受到垃圾收集。

有帮助吗?

解决方案

如果你正在开发一个低延迟的交易程序,你真正想要的在延迟方面的竞争的,然后BigDecimal 是不是你,它是那样简单。凡微秒的事,对象的创建和任何十进制数学就是太贵了。

我认为对的几乎的其他人一样,使用BigDecimal是想都不用想,因为这将有很少的可见的对应用性能的影响。

在延迟关键系统上进行交易决策,的任何的不可预测的垃圾收集暂停是完全乱了,问题因此而目前的垃圾收集交易算法是在正常使用太棒了,他们是不一定合适时的5毫秒的延迟可能会花费你很多钱。我期望大型系统被写在一个非常非OOP风格,很少或正在从一些实习字符串预留不使用的物体(代码等)。

您一定会需要使用 double (甚至 float ),并采取命中精度。

其他提示

JVM上是相当不错时下在处理短期对象的创建和销毁方面,所以这不是它曾经是担心。

我会建议建立的,你想要做什么大模型,和测量的它。这将是胜过一切“理论”的答案,你可能会得到更大量的: - )

看你的特定问题领域,类似的系统,我在过去的工作合作得很好用双打要使用BigDecimal达到的数据,它可能是值得重新审视在这方面你的思维。在BigDecimal的粗略地看一眼显示它具有5个或6个字段,和额外的内存消耗在单一双可能超过您有任何功能益处。

BigDecimal确实有性能比,也就是说,long非常低的,double甚至Long。至于这是否会令你的应用程序的性能显著差异取决于你的应用程序。

我建议找到你的应用程序中最慢的部分,做对的对比测试。它仍然不够快?如果没有,你可能要编写包含单个long小的不可变类,可能是检查溢出。

最大的问题是:你真正的需要的任意精度的小数计算?如果计算仅做分析数据,并根据这一点,那么舍入,最低显著位中的二进制表示的文物可能是不相关的,你的决定;只是继续使用double(和分析你的数值稳定性)。

如果您实际上做其数目必须加起来的交易和事项精度绝对,那么double是不是一种选择。也许你可以分开你的应用程序的这两个部分,且只在交易的一部分使用BigDecimal

如果这是不可能的,那么你就非常不走运的。你需要一个 BCD 数学库,我不认为Java有一个。您可以尝试写自己的,但是这将是一个大量的工作,结果可能仍然没有竞争力。

你为什么不使用一个长着的小数情况下隐含多少?例如,假设你有8位小数暗示,则0.01将1:1000000。

我不知道你有什么要求,但一般是在做财务计算时,一个无法承受造成浮点类型的精度命中。通常的准确性和适当的四舍五入是比金钱打交道时效率更重要。结果 如果你没有对付百分比和所有金额都是整数,你可以用一个这意味着你的货币单位的0.01使用整型类型(int,long或甚至BigInteger的)。结果 而且,即使你认为你能负担得起的准确性与double型击中,它可能是值得的BigDecimal首先尝试和检查,如果它真的很慢你。

我的团队,开展对应用程序的性能评估和优化工作,有一个应用程序最近,在使用Java大小数。与内存利用率观察显著的性能问题。我们后来改用牛顿拉夫森这使我们能够跟上精度计算和显示出大小数显著更好的性能。

我想补充..当我们用双打,我们看到在精度巨大的损失预期

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top