如何确定(或至少是猜测)递归方法的堆栈帧大小?

时间:2013-11-27 15:34:23

标签: c# .net clr stack-trace jit

我希望能够预测在发生StackOverflow异常之前适合堆栈的递归调用的数量。为此,我需要找出堆栈上给定方法调用的“覆盖区”。

有没有办法以编程方式执行此操作?我调查了System.Diagnostics.StackFrameSystem.Diagnostics.StackTrace,但找不到任何相关内容。

根据经验,使用this simple example,我发现足迹与:

完全不同
  • 32位vs 64位:〜22k vs~8k帧(不同的指针大小是否会增加~3倍?)
  • debug vs release:~22k vs~64k frames(Debug build添加各种特殊模式边界 - 检查填充+调试工具)
  • 非优化与优化:
      调试中
    • ~22k vs~51k(预期 - 更少的调试信息)
    • ~64k vs~51k in Release(这很奇怪!可能会采用一些记忆技术?)
  • 调试器附加vs未附加:令人惊讶的是这在jitted代码中有什么不同!
    • 85k vs 258k - 发布,优化开启
    • 14k vs 64k - 调试,优化关闭

很可能不同版本的.NET也会产生不同的结果。

总结一下:

看到堆栈帧大小与这些参数的差异如此之大,是否有一种编程方法可以确定给定方法在运行时的堆栈帧大小

'离线'(手动)怎么样?也许至少对于直接的,发布的,非优化的构建?

0 个答案:

没有答案
相关问题