Linux中的计时函数

2023年7月22日,周六上午


目录


预备知识

Linux系统函数sysconf

函数原型

sysconf 是一个缩写形式,其英文全称是 "System Configuration",意为 "系统配置"。

这个函数名反映了它的用途,即用于查询和获取系统的运行时配置信息。

通过调用 sysconf 函数,可以获取诸如最大文件数、页面大小、最大参数长度等与系统配置相关的信息。这些信息对于程序的正确运行和优化往往非常重要。

#include<unistd.h>

long sysconf(int name);

参数name用于指明要查询系统选项中的哪一项

sysconf 函数返回一个 long 类型的值,表示相应系统配置选项的值。如果查询失败或选项不可用,则返回-1。

参数介绍

在参数name里,可以填写如下宏:

  • _SC_ARG_MAX:最大参数长度
  • _SC_CHILD_MAX:最大子进程数
  • _SC_CLK_TCK:每秒的时钟滴答数
  • _SC_NGROUPS_MAX:每个进程可拥有的最大组数
  • _SC_OPEN_MAX:每个进程可打开的最大文件数
  • _SC_PAGESIZE:页面大小
  • _SC_RTSIG_MAX:实时信号最大数
  • _SC_STREAM_MAX:每个进程可打开的最大流数
  • _SC_TZNAME_MAX:时区名的最大长度
  • _SC_JOB_CONTROL:是否支持作业控制
  • _SC_SAVED_IDS:是否支持保存的用户ID和组ID
  • _SC_VERSION:POSIX.1 版本号
使用方法
#include<unistd.h>
#include<stdio.h>

int main(){
    //查询最大子进程数
    printf("child max:%ld\n",sysconf(_SC_CHILD_MAX));

    //查询每秒的时钟滴答数
    printf("clock tick per sec:%ld\n",sysconf(_SC_CLK_TCK));
}

数据类型clock_t

数据类型 clock_t 是一个整型值,代表时间度量单位"时钟计时单元(clock tick)"的数量
问题来了,我怎么知道一个“时钟计时单元”等于多少秒呢?
通过对sysconf的学习,已经知道通过调用sysconf(_SC_CLK_TCK)可以得到每秒会产生多少个“时钟计时单元”
那么“时钟计时单元”除以sysconf(_SC_CLK_TCK)就可以把“时钟计时单元”的数量转换成秒

times

函数原型

这是一个Linux系统特有的函数

#include<sys/times.h>

clock_t times(struct tms *buf);

tms结构体

 使用方法

#include<sys/times.h>
#include<unistd.h>
#include<stdio.h>

int main(){
    int i;
    struct tms time1,time2;
    long tick=sysconf(_SC_CLK_TCK);
    times(&time1);
    printf("User time=%.2fs,System time=%.2fs\n",
    (double)time1.tms_utime/tick,(double)time1.tms_stime/tick);
    //如果不强制转换成double类型,那么除出来的数会为零

    for(i=0;i<1000000000;i++);

    times(&time2);
    printf("User time=%.2fs,System time=%.2fs\n",
    (double)time2.tms_utime/tick,(double)time2.tms_stime/tick);
    //如果不强制转换成double类型,那么除出来的数会为零

}


clock

函数原型

clock是C语言的函数,而不是Linux特有的系统函数,而times是Linux特有的系统函数

这意味着,虽然返回值都是clock_t,但二者是由区别的:

Linux的系统函数times返回的clock_t,每秒的产生数量等于sysconf(_SC_CLK_TCK)的返回值,在Cent0S 7里是100

C语言函数clock返回的clock_t,每秒的产生数量等于宏CLOCKS_PER_SEC,其实就是10000

#include<time.h>

clock_t clock(void);

使用方法

#include<time.h>
#include<stdio.h>

int main(){
    int i;
    clock_t time1,time2;
    time1=clock();
    printf("time1=%.2fs\n",(double)time1/CLOCKS_PER_SEC);
    //如果不强制转换成double类型,那么除出来的数会为零

    for(i=0;i<1000000000;i++);

    time2=clock();
    printf("time2=%.2fs\n",(double)time2/CLOCKS_PER_SEC);
    //如果不强制转换成double类型,那么除出来的数会为零

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨龙之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值