关于时间的文章,大家可以参考我之前的一篇文章《C语言操作时间函数,实现定时执行某个任务小程序》
0、问题描述
粉丝想计算一个函数的执行时间。
一、问题分析
函数的执行时间的统计在嵌入式系统中会被频繁的用到,知识点很重要。本文从两个方面来讨论类似的问题:
程序内计算一个函数的执行时间计算一个程序的执行时间
二、程序内如何计算一个函数的执行时间?
1. 思路
我们在执行函数前后分别记录下时间戳,然后计算两个时间戳的差值即可。
我们需要借助函数clock_gettime来实现这个功能。看下该函数的定义:
#include <time.h>
int clock_gettime(clockid_t clk_id, struct timespec* tp);
可以根据需要,获取不同要求的精确时间
参数:
clk_id :
检索和设置的clk_id指定的时钟时间。
CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户改成其他,则对应的时间相应改变
CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间
CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间
tp :
获取的时间戳会存放到该结构体变量中
struct timespec
{
time_t tv_sec; 秒
long tv_nsec; 纳秒
};
返回值:
成功 0
失败 -1 ,同时errno会被赋值
因为我们希望计算执行某个函数的时间,所以我们第一个参数选择CLOCK_MONOTONIC。
2. 实例1
我们先来实现一个简单的程序:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <time.h>
5 #include <sys/time.h>
6 #include <sys/stat.h>
7 #include <sys/types.h>
8 #include <unistd.h>
9 #include <string.h>
10
11 int main()
12 {
13 int rc;
14 struct timespec ts_start, ts_end;
15
16 //start time before call function
17 rc = clock_gettime(CLOCK_MONOTONIC, &ts_start);
18
19 printf("you can call your function here");
20
21 //end time before call function
22 rc = clock_gettime(CLOCK_MONOTONIC, &ts_end);
23
24 printf("CLOCK_MONOTONIC reports %ld.%09ld seconds",
25 ts_end.tv_sec - ts_start.tv_sec, ts_end.tv_nsec - ts_start.tv_nsec);
26 }
19行 我们可以将自己要执行的函数放置在此处。