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