Clojure 解释VisualVM回溯

Clojure 解释VisualVM回溯,clojure,profiling,visualvm,Clojure,Profiling,Visualvm,我正在Mandelbrot集合资源管理器上进行CPU评测。出于某种原因,java.lang.PersistentHashMap$BitmapIndexedNode.find占用了相当大的CPU总时间百分比。当我拍摄分析结果的快照并获取该方法的回溯时,我得到以下结果: 我看到很多关于BigDecimal操作的引用。似乎在某个点上,BigDecimal运算符需要在PersistentHashMap上调用find 我对回溯的解释正确吗?调用find是否是BigDecimal操作的结果,这意味着我对此

我正在Mandelbrot集合资源管理器上进行CPU评测。出于某种原因,
java.lang.PersistentHashMap$BitmapIndexedNode.find
占用了相当大的CPU总时间百分比。当我拍摄分析结果的快照并获取该方法的回溯时,我得到以下结果:

我看到很多关于
BigDecimal
操作的引用。似乎在某个点上,
BigDecimal
运算符需要在
PersistentHashMap
上调用
find


我对回溯的解释正确吗?调用
find
是否是
BigDecimal
操作的结果,这意味着我对此无能为力?对他们来说,这似乎是一件奇怪的事情。我很难比clojure.lang.Numbers$BigDecimalOps更深入地挖掘,以验证这一点。

您的解释是正确的。加法、乘法、求反、除法和其他
BigDecimal
操作最终会进行哈希映射查找。这些是取消引用
*math context*
Var的一部分。每次在Clojure中对两个
BigDecimal
对象执行算术运算时,都会发生这种情况。除了切换到其他数字类型(如
double
)之外,没有什么可以做的

clojure.core/*math上下文*
dynamic变量没有docstring。据我所知,它是用来装东西的。MathContext对象可用于指定精度和BigDecimal操作。如果绑定了
*数学上下文*
,则其值将在Java运行时传递给BigDecimal方法,如中所示。当未绑定
*数学上下文*
时,将调用BigDecimal方法

问题中堆栈跟踪的相关部分是:

...
clojure.lang.PersistentHashMap.entryAt(Object)
clojure.lang.Var.getThreadBinding()
clojure.lang.Var.deref()
clojure.lang.Numbers$BigDecimalOps.add/multiply/..
...
Clojure源代码的一些指针:

  • *数学上下文*
    Var
  • 执行BigDecimal时取消引用数学上下文*。其他操作也会发生同样的情况
  • 解除对Var的引用需要调用
  • getThreadBinding