请教,测试程序的运行时间都有哪些nice的方法呢~
本文是原「蜗窝讨论区」的历史存档(2016-09-07),来自版块「Linux kernel技术问答」,共 2 帖。讨论区已停止服务,此处仅供查阅。
当前由于工作需要,在程序中需要测试每个xxx_init驱动接口函数的初始化时间:
Step1
往往这个时候,想到的是printf 的__TIME__(在源文件中插入当前编译时间),
然而,大家都知道,printf的话,会严重影响时间的准确性。
Step2
这个时候想到,如果在xxx_init之间插入printf打印时间有影响的话,那就把xxx_init的每个时间点记录在数组中,在初始化完成之后,统一将时间打印出来:
然后有了下面的做法:
以下是一个程序中的打点函数:
define DOT_SIZE 300
typedef struct{ //
unsigned int cnt;
unsigned int recor;
}Dot_rec;
Dot_rec dotrec = {0,{0}};
void trace(unsigned int line,unsigned int rec)
{
dotrec.recor = line;
dotrec.cnt++;
if(DOT_SIZE == dotrec.cnt)
{
dotrec.cnt = 0;
}
dotrec.recor = rec;
dotrec.cnt++;
if(DOT_SIZE == dotrec.cnt)
{
dotrec.cnt = 0;
}
}
define ltrace(a) trace(LINE,(unsigned int)(a));
void printrace(void)
{
int num;
DRV_Printf(“cnt = %d\n”,dotrec.cnt);
for(num= 0; num < DOT_SIZE; num++)
{
DRV_Printf("%d,",dotrec.recor[num]);
num++;
DRV_Printf("%x,",dotrec.recor[num]);
if(num%20 == 19)
{
DRV_Printf("-%d\n",num);
}
}
DRV_Printf("\n");
}
这个Step2,实际只是想想,并未采用该方法。
Step3
如果是用printf的__TIME__,打印的时间精确到秒级,测量程序执行时间,显然是不够用的。
因此想到,使用clock_gettime(CLOCK_MONOTONIC, &ts);
可以获得足够精确的每个xxx_init程序代码执行时间。
代码如下:
include <time.h>
define DOT_SIZE 600
typedef struct{ //
unsigned int cnt;
unsigned long recor;
}Dot_rec;
Dot_rec dotrec = {0,{0}};
void trace(unsigned int line,time_t tv_sec,long tv_nsec)
{
dotrec.recor = line;
dotrec.cnt++;
if(DOT_SIZE == dotrec.cnt)
{
dotrec.cnt = 0;
}
dotrec.recor = tv_sec;
dotrec.cnt++;
if(DOT_SIZE == dotrec.cnt)
{
dotrec.cnt = 0;
}
dotrec.recor = tv_nsec;
dotrec.cnt++;
if(DOT_SIZE == dotrec.cnt)
{
dotrec.cnt = 0;
}
}
define ltrace(a,b) trace(LINE,(time_t)a,( long b);
void printrace(void)
{
int num;
printf(“cnt = %d\n”,dotrec.cnt);
for(num = 0; num < DOT_SIZE; num++)
{
printf("%d,",dotrec.recor[num]);
num++;
printf("%x,",dotrec.recor[num]);
num++;
printf("%x,",dotrec.recor[num]);
if(num%20 == 19)
{
printf("-%d\n",num);
}
}
printf("\n");
}
这样的话,就满足了测试实际程序执行时间的要求.
但是引申一下,总觉得还有一些场景 和一些测试方法,自己没有想到!!!
比如在uboot下面,或者在中断中该如何测试代码运行时间???
在这里,想请教各位大虾,都用哪些方法测量程序运行时间呢???
喔 喔 对了,可以使用Linux的jffies的时间去测试? 没有用过,不知道是否精准~
以前debug启动时间的时候,是这样做的: 在bootloader启动的瞬间,启动一个专门用于启动时间优化的硬件timer。 然后在需要确认时间的点上,将timer的当前值保存在固定的memory区域,然后在需要的时候,打印出来。 这样的好处是,可以精确知道从boot、到kernel、再到Application,各个阶段的精确时间。
