【发布时间】:2022-01-23 19:57:40
【问题描述】:
我正在使用 Tracy 分析器对我的 C++ 程序(在 Linux 64 位上)进行一些性能测试,我看到了一个我无法证明的结果。 我测的代码sn-p是:
void doWork() {
MyObj obj;
while(m_channel.try_dequeue(obj) {
report(obj);
}
}
inline void report(const MyObj& obj) {
ZoneScoped;
}
您可以在下面以图形方式查看 report() 函数的测量结果(它几乎是空的)。
有 63 个 report() 调用。他们每个人都花费了少量时间和 1 个 report() 调用,相对于之前的 63 个调用花费了大量时间。如图所示,有定期的偷看。
我认为它与 ZoneScoped 宏有关。为了消除它的影响,我实现了一个简单的时间测量实用程序,它只是将时间戳放入队列。但结果还是一样。
我无法理解这些偷看的原因。任何想法都值得赞赏。
在测试时Linux机器上没有运行其他程序。
【问题讨论】:
-
图片不是很有帮助。你能以非图像形式显示数据吗?
-
计算机中还有其他可能会干扰运行的事情。 “定期偷看”让我想到了定时器中断。
-
1.分析器应该用于定位代码中的瓶颈,而不是衡量性能。 2. 对于性能测量,您可以使用 google benchmark。 3.调用空函数应该什么都不做。 C 和 C++ 具有“As-if 规则”,因此如果启用了编译器优化,则该功能应该被优化器移除。 3 请提供minimal reproducible example,拿这么低的性能代码是没有意义的。性能测量是困难的,充满了狡猾的陷阱。衡量一些不反映实际问题的东西很容易,这就是为什么提供完整的例子很重要。