0、前言
1秒 == 1000 毫秒 (millisecond)== 1000*1000 微秒(Microseconds) 1000*1000*1000 纳秒(nanosecond)
系统环境:
$ uname -srvpo
Linux 5.4.0-56-generic #62-Ubuntu SMP Mon Nov 23 19:20:19 UTC 2020 x86_64 GNU/Linux
1、计算秒
C中可以使用 time_t time(time_t *tloc)
来获取从1970-01-01 00:00:00 +0000至今所经过的秒数。
两次调用相减就可以获取时间间隔。
#include <time.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
time_t start, end;
start = time(NULL);
sleep(2);
end = time(NULL);
printf("diff time= %fs\n", difftime(end, start));
return 0;
}
编译运行:
$ gcc main.c
$ ./a.out
diff time= 2.000000s
使用以上方式计算的秒数还是比较准确的。
2、计算微秒
在C中还可以使用 gettimeofday(struct timeval *tv, struct timezone *tz)
来获取时间,时间精度达到微秒级,主要的结构体为:
/* A time value that is accurate to the nearest
microsecond but also has a range of years. */
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
调用两次就可以计算时间间隔:
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
size_t get_millis(struct timeval* start, struct timeval* end)
{
time_t seconds = end->tv_sec - start->tv_sec;
suseconds_t ms = end->tv_usec - start->tv_usec;
printf("seconds=%ld, micros=%ld\n", seconds, ms);
return seconds*1000 + ms/1000;
}
int main(int argc, char const *argv[])
{
struct timeval stv, endv;
gettimeofday(&stv, NULL);
usleep(2000);
sleep(1);
gettimeofday(&endv, NULL);
get_millis(&stv, &endv);
return 0;
}
在17,18行,我们使程序睡眠2000微秒和1秒。函数 get_millis
在第9行打印经过的秒数和微秒数,返回毫秒值。
编译执行:
$ gcc main.c
$ ./a.out
seconds=1, micros=2219
执行结果表明秒数准确,但是微秒值有一定的误差,这是不可避免。
3、计算纳秒
C中还可以使用 int timespec_get (struct timespec *__ts, int __base)
获取时间,精度到达纳秒。主要结构体为:
/* POSIX.1b structure for a time value. This is like a `struct timeval' but
has nanoseconds instead of microseconds. */
struct timespec
{
__time_t tv_sec; /* Seconds. */
__syscall_slong_t tv_nsec; /* Nanoseconds. */
};
调用两次就可以计算时间间隔:
#include <time.h>
#include <stdio.h>
#include <unistd.h>
size_t get_nanos(struct timespec* start, struct timespec* end)
{
time_t seconds = end->tv_sec - start->tv_sec;
long nano = end->tv_nsec - start->tv_nsec;
printf("seconds=%ld, nano=%ld\n", seconds, nano);
return (seconds*1000 + nano/1000000);
}
int main(int argc, char const *argv[])
{
struct timespec start, end;
timespec_get(&start, TIME_UTC);
usleep(2000);
sleep(1);
timespec_get(&end, TIME_UTC);
get_nanos(&start, &end);
return 0;
}
在18,19行,我们使程序睡眠2000微秒和1秒。函数 get_nanos
在第9行打印经过的秒数和纳秒数,返回毫秒值。
编译执行:
$ gcc main.c
$ ./a.out
seconds=1, nano=2268702
从执行结果可以看出,秒数准确,但是纳秒值有一定的误差,这是不可避免。
end