2

我想使用statprof.py来分析 PyPy 中的代码。不幸的是,它似乎不起作用,它指向的行号已关闭。有谁知道如何使它工作或知道替代方案?

4

1 回答 1

5

“行号关闭”很可能是因为 PyPy 在 JITted 代码中将内联许多函数,并且只会在循环结束时传递信号(这里来自计时器)。将此与 CPython 进行比较,后者在两个随机字节码之间传递信号——偶尔也在循环结束时,但通常在任何地方。因此,如果您将信号处理程序限制为仅在“循环结束”字节码处运行,那么在 PyPy 上获得的结果与在 CPython 上获得的结果相同。

这就是为什么这种分析似乎总是会遗漏很多函数,就像大多数没有循环的函数一样。

您可以尝试使用内置的 cProfile 模块。当然,它对性能的影响比统计分析更大,但无论如何都要尝试——例如,它不会阻止 JITting,因此性能影响应该仍然是合理的。

更一般地说,我看不到在 PyPy 中实现等效的统计分析的简单方法。在存在相互内联然后全局优化的函数的情况下,很难给出它的意义......如果你能发现一个工具确实存在,对于其他一些高级语言,我会很感兴趣,做统计在具有跟踪 JIT 的 VM 上进行分析。

我们可以记录足够的信息来跟踪每一小组汇编指令返回到它来自的真正 Python 函数,然后使用 hacks 在机器级别检查当前指令指针 (IP)。不是不可能,但认真的工作:-)

于 2013-06-27T16:49:22.323 回答