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

如何获取源代码或系统库中一个函数的cpu周期和执行时间,c,linux,gcc,time,C,Linux,Gcc,Time,我想得到一个算法的效率。该算法是由我自己实现的源代码或只是从一个库。main函数将通过调用我实现的函数或共享库的接口来执行算法。 现在我想得到算法所消耗的精确的执行时间和cpu周期 Linux+GCC+C语言 谢谢您可以插入代码,调用返回时间戳计数器的函数,并添加逻辑来计算代码所需的时间。 这显然会更改代码,您还需要自己进行更改,因此这是可行的。 您可以对整个程序计时,但这并不能提供大量关于时间使用方式的细粒度数据。衡量这类事情的最佳方法是在探查器中运行程序。如果您使用的是新的ish Linux

我想得到一个算法的效率。该算法是由我自己实现的源代码或只是从一个库。main函数将通过调用我实现的函数或共享库的接口来执行算法。 现在我想得到算法所消耗的精确的执行时间和cpu周期

Linux+GCC+C语言

谢谢

您可以插入代码,调用返回时间戳计数器的函数,并添加逻辑来计算代码所需的时间。
这显然会更改代码,您还需要自己进行更改,因此这是可行的。

您可以对整个程序计时,但这并不能提供大量关于时间使用方式的细粒度数据。

衡量这类事情的最佳方法是在探查器中运行程序。如果您使用的是新的ish Linux,您可以使用
perf

请考虑以下代码:

并实现如下所示的类:

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;    
};
我有一些类似的代码,可以自动统计不同类别中的一些统计数据。
但是,主要是在析构函数中,您必须将循环累积到统计类或其他内容中。

注意,
rtdsc
依赖于体系结构。但是,
get_cycles
是一种独立于体系结构的方法


<代码> fTrace<代码>是一种有趣的测量延迟的工具,它对性能优化非常有帮助。

这对我来说更像C++。但是,在C中使用get_cycles非常有效。您不需要ScopedTimer类。并发或多核因素会影响准确性吗?您用linux标记了这个问题。运行perf record-G“your_exec”和perf report怎么样?如果当前任务由于cpu调度而被其他程序抢占,那么“rdtsc”得到的值会比实际值大吗?
perf
是一个集成在Linux内核中的探查器。它提供了很多有用的信息。我相信stackoverflow上有一个标签,“在分析器中运行程序”gprof会有帮助吗?还是瓦尔金德?或者使用一楼提供的“uu asm volatile”(“rdtsc”):“=A”(t))?Thanks@river:我没有使用
gprof
的经验
valgrind
是一种有效的模拟,用于捕获程序中的错误。它比本机执行慢得多,所以我不建议使用它来评测。
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.
}