如何在源代码或系统库中获取一个函数的cpu周期和执行时间

时间:2014-11-20 12:44:38

标签: c linux gcc time

我想获得一种算法的效率。该算法由我自己实现为源代码或仅来自库。 main函数将通过调用我实现的函数或共享库的接口来执行算法。 现在我希望得到准确的算法消耗的执行时间和CPU周期

Linux + GCC + C语言

由于

3 个答案:

答案 0 :(得分:2)

考虑来自SO的代码:Get CPU cycle count?

static inline uint64_t get_cycles()
{
  uint64_t t;
  __asm volatile ("rdtsc" : "=A"(t));
  return t;
}

并实现类似以下的类:

class ScopedTimer
{
  public:
    ScopedTime () 
    {
      m_start = get_cycles ()
    }

    ~ScopedTimer () 
    {
      auto diff = get_cycles() - m_start;
      std::cout << "Takes " << diff << " cycles" << std::endl;
    }

  private:
   uint64_t m_start;    
};

最后,您只需在代码中使用该类:

void job () {
  ScopedTimer timer;
  // do some job
  // leaving the scope will automatically print the message in the desctrutor.
}

我有一些类似的代码可以自动计算不同类别的一些统计信息。 但是,主要在析构函数中,您必须将周期累积到统计类或其他内容中。

答案 1 :(得分:0)

您可以检测代码,调用返回时间戳计数器的函数,并添加逻辑来计算代码所需的时间。
这显然会改变代码,您还需要自己进行更改,以便它能够正常工作 你可以时间整个程序,但是在时间使用方式上并没有给你很多精细的数据。

最好的方法衡量这种事情是在分析器中运行程序。如果您使用的是新版Linux,则可以使用perf

答案 2 :(得分:0)

请注意,rtdsc取决于架构。但是,get_cycles是一种独立于架构的方法。

ftrace是一个测量延迟的有趣工具,它对性能优化非常有用。