如何检查应用的哪个部分在消耗CPU?
我有一个用wxPython做的应用程序,这个程序里有很多工作线程、空闲事件循环,还有其他一些处理事件的代码,这些都可能会消耗CPU。目前,当应用程序没有被操作时,它大约会消耗8-10%的CPU。
问题是:
有没有工具可以告诉我,应用程序的哪个部分或线程消耗了最多的CPU?如果没有这样的通用工具,我也想知道你们通常是怎么处理这种情况的?比如说,禁用应用程序的某个部分,或者进行跟踪等等。
编辑:可能我问题的表述不太清楚,我并不是想知道我代码中的哪个函数或代码块消耗了最多的资源,因为我可以使用性能分析工具来查看这一点。我想知道的是,当我运行我的应用程序时,看到CPU使用率是8-10%,有没有办法知道我的应用程序的不同部分或线程是如何使用这10%的CPU的?基本上,我想在那个瞬间知道,代码的哪个部分正在运行?
4 个回答
0
从不依赖特定编程语言的角度来看,这种做法并不太实用。把编程语言去掉后,剩下的就是一堆机器代码指令,还有一些系统调用。你可以在Linux上使用strace,或者在Windows上用ProcessExplorer,试着从这些系统调用中猜测发生了什么,但其实直接使用性能分析工具会更有意义。如果你能访问到编程语言,那么你可以做一些额外的记录,或者在调试器中随机暂停,但在这种情况下,性能分析工具仍然是你最好的选择。
0
我通过写一个修改版的 Python trace 模块来解决我的问题,这个模块可以随时开启或关闭。基本上就是对 Trace
类进行了一些改动,像这样:
import sys
import trace
class MyTrace(trace.Trace):
def __init__(self, *args, **kwargs):
trace.Trace.__init__(self, *args, **kwargs)
self.enabled = False
def localtrace_trace_and_count(self, *args, **kwargs):
if not self.enabled:
return None
return trace.Trace.localtrace_trace_and_count(self, *args, **kwargs)
tracer = MyTrace(ignoredirs=[sys.prefix, sys.exec_prefix],)
def main():
a = 1
tracer.enabled = True
a = 2
tracer.enabled = False
a = 3
# run the new command using the given tracer
tracer.run('main()')
输出结果:
--- modulename: untitled-2, funcname: main
untitled-2.py(19): a = 2
untitled-2.py(20): tracer.enabled = False
在关键的地方开启这个功能,可以帮助我逐行跟踪哪些代码语句正在执行,执行得最多。