我可以让 Qt 分析信号槽执行持续时间吗?

Posted

技术标签:

【中文标题】我可以让 Qt 分析信号槽执行持续时间吗?【英文标题】:Can I get Qt to profile signal-slot execution duration? 【发布时间】:2017-04-20 11:47:14 【问题描述】:

我在 Windows 上有一个 Qt 控制台应用程序。我想对其进行分析,但 QtCreator 分析在 Windows 上不起作用。

我只使用了几个信号/插槽。该应用程序是单线程的,每个连接都是Qt::QueuedConnection

Qt 能否记录执行从事件循环中调用的每个槽所需的时间?它可以帮助我找到 CPU 瓶颈,而无需在程序的任何地方手动添加计时器。

是否有可能覆盖槽调用机制并测量被调用槽执行的时间?

【问题讨论】:

请注意,即使有一些 hack 或替代分析解决方案,我仍在寻找有关如何分析槽执行的答案。 Slot 是一个通用函数。为什么不能使用分析器来衡量执行一个函数需要多少时间? @vahancho 因为我不知道任何可以在 Windows 上可靠运行的通用分析器。相信我,我尝试了很多,但它们都很糟糕。 【参考方案1】:

排队的槽调用作为QMetaCallEvent 传递给接收QObject。因此,您可以在 QCoreApplication::notify 传递这些事件时对其进行计时:从该方法中调用 QObject::event

这有两个方面:

    时间和数据收集 - 有关完整示例,请参阅 this answer。

    解码QMetaCallEvent 的内容以了解调用了哪个方法 - 请参阅this question。

【讨论】:

所以我实现了这个并且它有点工作。但问题是我使用编译时信号/槽语法 (&MyClass::mySlot) 和 target->metaObject()->method(metaCall->id()).methodSignature‌​() 总是返回空字符串,因为元方法无效。你能补充更多细节吗,还是我应该专门问一个关于这个的问题? 链接的问题仍然有效,它只需要另一个处理现代调用语法的答案。从新语法中获取方法签名也很容易解决。我只是还没开始。 有什么我可以看看的吗?并不是我非常需要它——此时我最好在方法中使用手动计时器——但我发现这对 Qt 内部的东西进行挖掘非常有趣。

以上是关于我可以让 Qt 分析信号槽执行持续时间吗?的主要内容,如果未能解决你的问题,请参考以下文章

Qt信号与槽函数问题

QT 信号和槽函数签名

qt 关于信号槽传递的参数问题

Qt编程中信号与槽机制可以用啥方法替换

Qt 槽函数怎么传递参数

qt中c语言函数发送qt信号