【问题标题】:Programmatically Getting Total Time and Busy Time of Function on Linux以编程方式获取 Linux 上函数的总时间和忙碌时间
【发布时间】:2013-04-06 06:12:24
【问题描述】:

有没有办法以编程方式获取 C 程序运行的总时间,以及在特定函数中花费的时间量?我需要在代码中执行此操作,因为我想将这两个值用作另一个函数的参数。由于我在 Linux 上,我可以使用 gprof 或 perf 来执行此操作吗?

【问题讨论】:

标签: c linux function time profiling


【解决方案1】:

您也可以使用gprof

【讨论】:

    【解决方案2】:
    1. 获取程序启动时的系统时间。然后,无论何时,您都可以获得当前时间并减去开始时间。这表明你已经跑了多长时间,以挂钟时间计。

    2. 有一个全局布尔 Q,当你的函数进入时设置为 True,当它退出时设置为 False,所以它只有在程序“进入”函数时才为 True(包括)。

    3. 将定时器中断设置为每 N 毫秒触发一次,并有两个全局计数器 A 和 B。(N 不必很小。)当定时器中断时,不管它是否递增 B,但只有如果 Q 为真,则增加 A。

    这样,您就知道已经过去了多少时间,而 A/B 是您的函数在堆栈上的那部分时间。

    顺便说一句:如果函数是递归的,则令 Q 为整数“深度计数器”。否则,没有变化。

    【讨论】:

    • 或者,我不能每次调用函数时都在函数内启动一个新计时器,当函数返回时,将经过的时间添加到计数器(如示例中的 B)?
    • @John:这可行,但是与函数中发生的事情相比,调用 get-time 例程可能会很昂贵。中断方法的优点是采样率可以尽可能低。它不一定是高频。
    【解决方案3】:

    是的,您可以使用gprof,但这需要重新编译您要测量的二进制文件以插入所需的监控代码。默认情况下,程序不会花时间记录这些数据,因此您必须添加它。使用 gcc,这是使用 -pg 选项完成的。

    【讨论】:

    • 如何以编程方式从 gprof 获取分析数据?我没有办法。
    • -pg 插入代码以计算函数调用并跟踪调用者;它不插入监控代码;监控由操作系统完成,它会定期对 IP 地址进行采样。
    猜你喜欢
    • 2016-08-24
    • 2014-05-21
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    相关资源
    最近更新 更多