【问题标题】:Why is the taken time of a function call(empty function) not stable?为什么函数调用(空函数)的耗时不稳定?
【发布时间】: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,拿这么低的性能代码是没有意义的。性能测量是困难的,充满了狡猾的陷阱。衡量一些不反映实际问题的东西很容易,这就是为什么提供完整的例子很重要。

标签: c++ performance-testing


【解决方案1】:

看起来它是一个多线程应用程序,它暴露于线程上下文切换、饥饿或contentions 本质上是不确定的,因为每次测量应用程序时其他线程可能会做不同的事情。每次测量时,队列本身也可能有不同数量的元素。我会通过使用某种模拟来确保每次运行中的条件都是相同的。请注意,即使您没有明确运行它们(可能是一些守护进程等),后台也不太可能没有其他程序在运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2011-11-13
    • 2022-01-06
    • 2020-10-22
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多