使用 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% 的“包含”时间。
<cycle>
不是真正的函数,这就是 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 应用程序,有时关闭循环检测很有用,即使递归调用存在一些可视化错误。
如果不进行循环检测,则不会生成合成 <cycle>
函数,但某些函数可能具有 >100% 的“包含”。时间。尝试使用“Self”时间,或格式更好的分析工具(linux perf
、operf
、ocperf.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> 函数的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章