为什么成本中心堆栈在haskell的档案文件中变得混乱?

wswtfjt7  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(104)

我试图在haskell中对我的项目进行概要分析,但在概要文件(。我看到函数栈打印的顺序似乎有点混乱。
例如,当检查成本中心(https://hackage.haskell.org/package/ghc-prof-1.4.1.12/docs/src/GHC。html#CostCentre)堆栈中的。下面是我看到的成本中心栈。

logError
  log
   findCustomerFromDB
    getDBConfig
     rSet
      rSetB
       preInitEncryptedOrder
        decodeOrderDetails
         mkOptionKey
          encode
           fromEncoding
           genericToJSON
            unTagged
           value
            encodeToBuilder
             array
              unId
              emptyArray_

但是,我无法理解为什么在log函数中,分析器会将数据库调用作为其子函数打印出来。(PS.在代码中,我没有在日志函数中进行DB调用)

umuewwlo

umuewwlo1#

呼叫中心堆栈的构造是精确的,因为成本中心是进入和退出的,所以它的构造不受抽样的影响。不是在程序执行期间存在的所有呼叫中心堆栈都将被采样,但是被采样的任何呼叫中心堆栈将是实际的呼叫堆栈,而不是采样错误的某些伪像。
此外,调用中心堆栈在创建时存储在thunks中,并在thunk被求值时恢复,因此惰性求值不会产生奇怪的混合堆栈,代表函数调用,当惰性值在某些不可预测的时间实际上被强制执行时,碰巧生效。
因此,假设这些成本中心已被正确命名(即如果你没有看到一个名为log的函数的代码,并将其与一个完全不同的log函数的分析信息进行比较,那么除了显而易见的一个之外,你的调用堆栈没有任何逻辑解释:实际上,findCustomerFromDB是由log函数直接调用的,或者通过其他内联函数调用。
我建议仔细检查您的log函数,并检查它是否调用了一个助手函数,该函数将一些调试信息添加到记录的字符串中,例如发起违规请求的客户的名称。

相关问题