当前位置: 首页 > 面试题库 >

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

朱祺
2023-03-14
问题内容

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

我不会对它们进行很多数学运算,因此问题不关乎BigDecimal本身的性能,而是关乎BigDecimal对象的数量会影响应用程序的性能。

我担心的是,大量短暂的BigDecimal对象会给GC造成压力,并导致CMS收集器中更大的Stop-The-World停顿-这绝对是我要避免的事情。

您能否确认我的担忧并提出使用BigD的替代方法?另外,如果您认为我的担心有误-请说明原因。

更新

感谢所有回答。我现在坚信使用BigDecimal会损害应用程序的延迟(即使我仍然打算对其进行衡量)。

目前,我们决定坚持使用“非常非OOP”解决方案(但不会降低准确性)-使用2
ints,一个用于尾数,另一个用于指数。其基本原理是将基元放在堆栈上,而不是堆上,因此不进行垃圾回收。


问题答案:

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

我认为对于 几乎 所有其他人来说,使用BigDecimal都是理所当然的,因为它对应用程序性能几乎没有 可见的 影响。

在做出交易决定的延迟关键系统中, 任何
不可预料的垃圾收集暂停都是完全无法解决的,因此,尽管当前的垃圾收集算法在正常使用中非常出色,但当延迟5毫秒时,它们不一定适用花了你很多钱。我希望大型系统是以非常非OOP的风格编写的,除了一些内部字符串(用于代码等)之外,几乎没有使用任何对象。

您肯定需要使用 double (甚至 float )来提高准确性。



 类似资料:
  • 我想知道是否可以通过使用更多的超类来提高应用程序的性能。我的问题是关于Kotlin的,但我假设对Java的答案也是一样的。 假设您有这样的继承模式(右边的类是他左边的类的子类): a 也就是说,您不需要所有子类中定义的所有东西,而只需要A类的属性和函数。由于一个模糊的原因,您的代码只使用Z类。 提前感谢您的回答。

  • 问题内容: 我们已经开始将spring aop用于我们应用程序的各个方面(当前的安全性和缓存)。 我的经理虽然十分了解这种技术的好处,但仍担心该技术对性能的影响。 我的问题是,你是否遇到了使用aop(特别是spring aop)引入的性能问题? 问题答案: 只要你能够控制自己的AOP,我就认为它是有效的。无论如何,我们确实确实存在性能问题,所以通过我们自己的推理,我们无法完全控制;)这主要是因为重

  • 问题内容: 这 比这慢 但是呢? 我的测试表明第二个和第三个示例完全相同。如果是这样,我的问题是,为什么要使用“ =”? 问题答案: 使用绑定变量时,有一个明显的区别,绑定变量应该在Oracle中用于数据仓库或其他批量数据操作以外的其他任何操作。 以下列情况为例: Oracle在执行之前不知道:b1的值为’%some_value%’或’some_value’等,因此它将根据启发式方法估计结果的基数

  • HTTP/1.1 200确定缓存-控制:max-age=0,必须重新验证 内容-处置:附件;filename=“执行摘要.pdf” 内容-类型:application/pdf

  • 问题内容: 我正在开发一个应用程序,一种设计方法涉及大量使用操作员。虽然我知道OO设计通常会尝试避免使用,但这是另一回事了,这个问题与性能完全相关。我想知道是否会对性能产生影响?是一样快吗? 例如,我有一个包含10个子类的基类。在采用基类的单个函数中,我检查该类是否是子类的实例并执行一些例程。 我想解决的另一种方法是改用“类型ID”整数基元,并使用位掩码表示子类的类别,然后将子类“类型ID”与位掩

  • 我创建了几个类似上面示例的记录器,问题是,当我使用运行Spring应用程序时,不会被记录,只有Spring默认/内部记录器才会实际使用参数。 如何使记录器也使用参数?