蜗窝科技

请教,测试程序的运行时间都有哪些nice的方法呢~

蜗窝讨论区存档 · Linux kernel技术问答 · 楼主 728330453 · 2016-09-07 · 2 帖

本文是原「蜗窝讨论区」的历史存档(2016-09-07),来自版块「Linux kernel技术问答」,共 2 帖。讨论区已停止服务,此处仅供查阅。

728330453 · 2016-09-07 23:03

当前由于工作需要,在程序中需要测试每个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 &lt; 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的时间去测试? 没有用过,不知道是否精准~

弯曲的旅行 · 2016-09-08 09:32

以前debug启动时间的时候,是这样做的: 在bootloader启动的瞬间,启动一个专门用于启动时间优化的硬件timer。 然后在需要确认时间的点上,将timer的当前值保存在固定的memory区域,然后在需要的时候,打印出来。 这样的好处是,可以精确知道从boot、到kernel、再到Application,各个阶段的精确时间。