如何使用BigDecimal会影响应用程序性能?

vtr*_*kov 13 java performance bigdecimal

我想使用BigDecimal来表示低延迟交易应用程序中的任意精度数字,如价格和金额,每秒有数千个订单和执行报告.

我不会对它们进行很多数学运算,所以问题不在于BigDecimal本身的性能,而在于大量BigDecimal对象会如何影响应用程序的性能.

我担心的是,大量短命的BigDecimal对象会给GC带来压力并导致CMS收集器中更大的Stop-The-World暂停 - 这绝对是我想要避免的.

您能否确认我的疑虑并建议使用BigD的替代方案?此外,如果您认为我的担忧是错误的 - 请解释原因.

更新:

感谢所有回答的人.我现在确信使用BigDecimal会损害我的应用程序的延迟(即使我仍然计划测量它).

目前我们决定坚持使用"非常非OOP"解决方案(但没有精确命中) - 使用两个ints,一个用于尾数,另一个用于指数.这背后的基本原理是基元放在堆栈上,而不是堆,因此不受垃圾收集的影响.

oxb*_*kes 13

如果你正在开发一个低延迟的交易程序,并且你真的想要在延迟方面竞争,那么BigDecimal 不适合你,就这么简单.微秒很重要,对象创建和任何十进制数学都太贵了.

我认为对于几乎所有其他人来说,使用BigDecimal是不费脑子的,因为它对应用程序性能几乎没有明显的影响.

在制定交易决策的延迟关键系统中,任何不可预测的垃圾收集暂停都是完全不可能的,因此当前的垃圾收集算法在正常使用中非常棒,当延迟5毫秒时它们不一定合适.花了你很多钱.我希望大型系统是以非OOP风格编写的,除了一些实际的字符串(代码等)之外几乎没有使用任何对象.

你当然需要使用double(或者甚至float)并获得精确度.

  • +1表示关于竞争性能的关键点.就像关于老虎和跑鞋的笑话一样,绝对数字很少重要,比重要的更好/更糟. (2认同)

Bri*_*new 7

JVM现在在处理短期对象的创建和销毁方面非常好,所以这不是曾经的担心.

我建议建立一个你想做的模型,并测量它.这比你可能获得的任何"理论"答案更值得:-)

看看你的特定问题领域,过去我曾经使用的类似系统使用双打来处理你想要使用BigDecimal的数据,并且值得重新审视你在这方面的想法.粗略地看一眼BigDecimal显示它有5或6个字段,而单个双倍的额外内存消耗可能超过您拥有的任何功能优势.

  • 我发现很难相信一个基于数量和价格双倍的交易系统可以运行,更不用说非常好。正确性几乎不是人们应该重新检查的“功能优势”。 (2认同)
  • +1“构建和测量”。写得太多了,好像一般趋势适用于每种情况。 (2认同)

Tom*_*ine 5

BigDecimal确实有性能比,也就是说,非常低的long,double甚至Long.这是否会对您的应用程序的性能产生重大影响取决于您的应用程序.

我建议找到你应用程序中最慢的部分并对其进行比较测试.它还够快吗?如果没有,您可能想要编写一个包含单个的小的不可变类long,可能会检查溢出.