linux-如何确定C程序中每个函数所用的时间

时间:2013-01-22 10:18:04

标签: linux linux-kernel

我想检查项目中每个函数和系统调用所花费的时间。我的代码是用户和内核空间的一部分。所以我需要在两个空间都花时间。我有兴趣了解CPU时间和磁盘IO方面的性能。我应该使用profiler工具吗?如果是的话哪个会更优选?或者我有什么其他选择?

请帮忙, 感谢

3 个答案:

答案 0 :(得分:1)

对于内核级别分析或某些指令或函数所用的时间可以使用时钟抽头来测量。为了获得实际可以使用多少时钟滴答来执行给定任务,可以通过内核函数来测量......

#include <sys/time.h>
unsigned long ini,end;
rdtscl(ini);
...your code....
rdtscl(end);

printk("time lapse in cpu clics: %lu\n",(end-ini));

了解更多详情http://www.xml.com/ldd/chapter/book/ch06.html 如果您的代码花费更多时间,那么您也可以有效地使用 jiffies

对于用户空间分析,您可以使用各种计时功能,以纳秒分辨率或oprofile(http://oprofile.sourceforge.net/about/)&amp;请参考Timer function to provide time in nano seconds using C++

答案 1 :(得分:1)

对于内核空间函数跟踪和分析(包括调用图格式和各个函数所用的时间),请考虑使用 Ftrace 框架。

特别是对于函数分析(在内核中),启用CONFIG_FUNCTION_PROFILER内核配置:在Kernel Hacking / Tracing / Kernel function profiler下。

这是帮助:

  

CONFIG_FUNCTION_PROFILER:

     

此选项启用内核功能分析器。创建文件
  在debugfs中调用function_profile_enabled,默认为零   当一个1被回显到这个文件中时,分析开始,当一个
时   输入零,分析停止。在“。”中创建“函数”文件   trace_stats目录;此文件显示了该功能列表   已被击中和他们的柜台。

一些资源:

Documentation/trace/ftrace.txt

Secrets of the Ftrace function tracer

Using ftrace to Identify the Process Calling a Kernel Function

答案 2 :(得分:0)

嗯,我只在用户空间开发,所以我不知道,这对于磁盘IO或内核空间分析有多大帮助,但我用oprofile进行了大量的分析。

我暂时没有使用它,所以我不能给你一步一步的指南,但你可以在这里找到更多的信息:

http://oprofile.sourceforge.net/doc/results.html

通常这有助于我找到问题所在。 您可能需要使用opreport输出,以获得所需的结果。