我有一个wxPython应用程序,它有许多工作线程,空闲事件周期以及许多其他可以消耗CPU的事件处理代码,现在当应用程序没有进行交互时消耗大约8-10%的CPU。
问题:
是否有一个工具可以分辨我的应用程序的哪些部分/线程消耗大部分CPU?如果没有这样的通用工具,我愿意知道您通常采取的解决此类方案的方法吗?例如禁用部分应用,跟踪等
编辑:可能是我的问题的语言含糊不清,我不想知道我的代码中的哪个函数或代码块占用了大部分资源,因为我可以使用分析器。 我想知道的是当我运行我的应用程序时,我看到cpu使用率是8-10%,现在是否有办法知道我的应用程序的不同部分,线程正在消耗10%cpu? 基本上在那一刻,我想知道代码的哪个部分正在运行?
答案 0 :(得分:1)
如果您的所有主题都有独特的启动方法,则可以使用profiler that comes with Python。
如果你在Mac上,你应该查看仪器应用程序。您也可以将dtrace用于Linux。
答案 1 :(得分:0)
这在语言不可知的水平上不太实用。拿走语言,你剩下的就是一大堆机器代码指令,随处理系统调用。您可以在Windows上使用strace或在Windows上使用ProcessExplorer来尝试猜测这些系统调用发生了什么,但是使用分析器会更有意义。如果您确实可以访问该语言,那么您可以执行各种操作(额外的日志记录,在调试器中随机暂停),但在这种情况下,分析器仍然是您最好的工具。
答案 2 :(得分: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
在关键点启用它有助于我逐行跟踪哪些代码语句执行最多。
答案 3 :(得分:0)
在Windows XP及更高版本上,Process Explorer将显示所有进程,您可以查看每个进程的属性并查看打开的线程。它显示了线程ID,开始时间,状态,内核时间,用户时间等。