我在我的Mandelbrot Set资源管理器上进行CPU分析。出于某种原因,java.lang.PersistentHashMap$BitmapIndexedNode.find
占用了总CPU时间的相当大的百分比。当我拍摄分析结果的快照,并获得该方法的回溯时,我得到了这个:
我看到很多对BigDecimal
操作的引用。好像BigDecimal
运营商在某些时候需要在find
上调用PersistentHashMap
。
我对回溯的解释是否正确?调用find
是BigDecimal
操作的结果,这意味着我无能为力吗?这对他们来说似乎是一件奇怪的事情。我虽然难以深入挖掘clojure.lang.Numbers$BigDecimalOps
以验证这一点。
答案 0 :(得分:1)
您的解释是正确的。加法,乘法,否定,除法和其他BigDecimal
操作最终会进行哈希映射查找。这些是取消引用*math-context*
Var的一部分。每次在Clojure中对两个BigDecimal
对象执行算术运算时都会发生这种情况。除了切换到其他数字类型之外,没有什么可以做的,比如double
。
clojure.core/*math-context*
动态Var没有文档字符串。据我所知,它旨在持有一个java.math.MathContext对象。 MathContext对象可用于为BigDecimal操作指定精度和rounding mode。如果绑定了*math-context*
,则其值将传递给Java运行时中的BigDecimal方法,如BigDecimal.add(BigDecimal augend, MathContext mc)中所示。未绑定*math-context*
时,BigDecimal方法称为without passing a context。
问题的堆栈跟踪的相关部分是:
...
clojure.lang.PersistentHashMap.entryAt(Object)
clojure.lang.Var.getThreadBinding()
clojure.lang.Var.deref()
clojure.lang.Numbers$BigDecimalOps.add/multiply/..
...
Clojure源代码的一些指示:
*math-context*
Var defined *math-context*
被取消引用。其他操作也会发生同样的事情getThreadBinding