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