使用 KchacheGrind 分析的 cProfile 输出中 <cycle 5> 函数的含义是啥?

Posted

技术标签:

【中文标题】使用 KchacheGrind 分析的 cProfile 输出中 <cycle 5> 函数的含义是啥?【英文标题】:What is the meaning of <cycle 5> function in the output of cProfile analyzed using KchacheGrind?使用 KchacheGrind 分析的 cProfile 输出中 <cycle 5> 函数的含义是什么? 【发布时间】:2017-11-09 20:26:48 【问题描述】:

我想分析python代码的性能,为此我使用了cProfile模块并生成了python documentation中提到的.cprof文件。我正在使用 pyprof2calltree python 模块将 .cprof 文件打开到 KCacheGrind 中。 。我放了分析结果的截图,它显示名为 cycle 5 的函数占用了 100.04% 的 CPU 时间。我无法理解这代表什么。它也没有显示此功能的任何源代码。

【问题讨论】:

【参考方案1】:

它表明名为 cycle 5 的函数占用了 100.04% 的 CPU 时间。

不,它表明某些“周期 5”以及从中调用的所有函数以及从它们调用的所有函数都在使用 100% 的“包含”时间。

&lt;cycle&gt; 不是真正的函数,这就是 kcachegrind heuristically tries to get recursion information from the profiling format 的方式(“循环内调用的包容性成本毫无意义”)。 This format (defined for callgrind) 没有函数调用序列的确切信息(f1 调用 f2 再调用 f3 ...),只存储调用者-被调用者对。此格式仅适用于“Self”时间,但不适用于存在递归时的“Inclusive”(包括所有被调用者时间)。

KCachegrind 允许(并建议)您使用 View Menu 关闭“Do Cycle Detection”:https://kcachegrind.github.io/html/NewsOld.html

循环检测可通过工具栏按钮进行切换。对于 GUI 应用程序,有时关闭循环检测很有用,即使递归调用存在一些可视化错误。

如果不进行循环检测,则不会生成合成 &lt;cycle&gt; 函数,但某些函数可能具有 >100% 的“包含”。时间。尝试使用“Self”时间,或格式更好的分析工具(linux perfoperfocperf.py;google 的 cpuprofile 和其他使用完整函数调用堆栈的分析格式)。 https://github.com/jrfonseca/gprof2dot 列出了许多好的格式,它还可以正确地可视化它们(如果有足够的信息)。尝试使用 python 配置文件格式:

python 配置文件

python -m profile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png

python cProfile(以前称为 lsprof)

python -m cProfile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png

python 热门分析器

hotshot profiler 不包含 main 函数。请改用 hotshotmain.py 脚本。

 hotshotmain.py -o output.pstats path/to/your/script arg1 arg2
 gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png

【讨论】:

以上是关于使用 KchacheGrind 分析的 cProfile 输出中 <cycle 5> 函数的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

RaspberryPi cProfile使用

分析 Mnesia 查询

过滤掉不相关的 cProfile 输出

在 Docker 中安装 GCP Profiler 代理时遇到问题

【SVF-2】使用SVF进行简单分析

Spring事务源码分析专题JdbcTemplate使用及源码分析