如何检查应用的哪个部分在消耗CPU?

0 投票
4 回答
2784 浏览
提问于 2025-04-15 14:34

我有一个用wxPython做的应用程序,这个程序里有很多工作线程、空闲事件循环,还有其他一些处理事件的代码,这些都可能会消耗CPU。目前,当应用程序没有被操作时,它大约会消耗8-10%的CPU。

问题是:

有没有工具可以告诉我,应用程序的哪个部分或线程消耗了最多的CPU?如果没有这样的通用工具,我也想知道你们通常是怎么处理这种情况的?比如说,禁用应用程序的某个部分,或者进行跟踪等等。

编辑:可能我问题的表述不太清楚,我并不是想知道我代码中的哪个函数或代码块消耗了最多的资源,因为我可以使用性能分析工具来查看这一点。我想知道的是,当我运行我的应用程序时,看到CPU使用率是8-10%,有没有办法知道我的应用程序的不同部分或线程是如何使用这10%的CPU的?基本上,我想在那个瞬间知道,代码的哪个部分正在运行?

4 个回答

0

从不依赖特定编程语言的角度来看,这种做法并不太实用。把编程语言去掉后,剩下的就是一堆机器代码指令,还有一些系统调用。你可以在Linux上使用strace,或者在Windows上用ProcessExplorer,试着从这些系统调用中猜测发生了什么,但其实直接使用性能分析工具会更有意义。如果你能访问到编程语言,那么你可以做一些额外的记录,或者在调试器中随机暂停,但在这种情况下,性能分析工具仍然是你最好的选择。

1

如果你所有的线程都有独特的启动方法,你可以使用Python自带的性能分析工具

如果你在使用Mac电脑,可以试试Instruments这个应用。对于Linux系统,你也可以使用dtrace工具。

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

在关键的地方开启这个功能,可以帮助我逐行跟踪哪些代码语句正在执行,执行得最多。

撰写回答