0

我有一个 wxPython 应用程序,它有许多工作线程、空闲事件周期和许多其他可以消耗 CPU 的事件处理代码,现在当应用程序不与它交互时消耗大约 8-10% 的 CPU。

问题:

是否有工具可以判断我的应用程序的哪些部分/线程消耗最多的 CPU?如果没有这样的通用工具,我愿意知道您通常采用哪些方法来解决此类情况?例如禁用部分应用程序、跟踪等

编辑:可能是我的问题的语言不明确,我不想知道我的代码中的哪个函数或代码块占用了大部分资源,因为我可以使用分析器。我想知道的是当我运行我的应用程序时,我看到 cpu 使用率为 8-10%,现在有没有办法知道我的应用程序的哪些不同部分、线程正在使用这 10% 的 cpu?基本上在那一刻我想知道代码的哪一部分正在运行?

4

4 回答 4

1

如果您的所有线程都有独特的启动方法,您可以使用Python 附带的分析器

如果您使用的是 Mac,则应该查看 Instruments 应用程序。您还可以在 Linux 上使用dtrace

于 2009-09-24T09:00:50.013 回答
0

在与语言无关的级别上,这不是很实用。去掉语言,你剩下的就是一堆机器代码指令,这些指令到处都是系统调用。您可以在 Linux 上使用 strace 或在 Windows 上使用 ProcessExplorer 来尝试猜测这些系统调用发生了什么,但仅使用探查器会更有意义。如果您确实可以访问该语言,那么您可以做很多事情(额外的日志记录、调试器中的随机暂停),但在这种情况下,分析器仍然是您最好的工具。

于 2009-09-24T09:51:32.807 回答
0

在 Windows XP 及更高版本上,Process Explorer将显示所有进程,您可以查看每个进程的属性并查看打开的线程。它显示线程 ID、开始时间、状态、内核时间、用户时间等。

于 2009-10-22T16:35:43.760 回答
0

我可以通过编写修改版本的python跟踪模块来解决我的问题,可以启用禁用,基本上修改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

在关键点启用它有助于我逐行跟踪哪些代码语句执行得最多。

于 2009-09-24T10:38:28.577 回答