Linux程序开发实用技巧: 如何正确使用C语言中的clock (linux c clock())

在Linux程序开发中,我们经常需要计算代码执行时间,以便优化程序性能。而C语言中的clock函数正是解决这个问题的常用方法。但是,如果不正确地使用clock函数,可能会导致错误的结果,甚至是程序崩溃。本文将介绍如何正确使用C语言中的clock函数,以便更好地优化程序性能。

1. 了解clock函数的返回值

在C语言中,clock函数返回的是处理器时钟计时器所经过的时钟周期数。通常来说,这个时钟周期数是以10毫秒为单位递增的。所以,每次调用clock函数时返回的数值都是比上一次调用时大一些的。这个数值通常被称为处理器时钟数(processor clock)或系统时间。

需要注意的是,clock函数返回的是处理器时钟计时器所经过的时钟周期数,而不是实际时间。也就是说,如果处理器时钟计时器每个周期都是10毫秒,那么在1秒钟内,clock函数将返回100个计时周期数,而不管实际时间是多少。因此,我们可以通过计算clock函数返回的计时周期数,来计算程序所花费的时间。

2. 使用clock函数计算程序执行时间

下面是一个使用clock函数计算程序执行时间的示例代码:

“`c

#include

#include

int mn()

{

clock_t start, end;

double cpu_time_used;

start = clock();

// 执行程序代码

end = clock();

cpu_time_used = ((double) (end – start)) / CLOCKS_PER_SEC;

printf(“CPU time used: %f\n”, cpu_time_used);

return 0;

}

“`

在这个示例代码中,我们首先声明了一个clock_t类型的变量start和end,用于记录程序开始和结束时的处理器时钟周期数。然后,在程序开始前调用clock函数获取当前的处理器时钟计时器数值,并将其赋值给start变量。程序结束后,我们再次调用clock函数获取当前的处理器时钟计时器数值,并将其赋值给end变量。通过计算end和start之间的差值,再除以一个常数CLOCKS_PER_SEC(它表示每秒钟的时钟周期数)得到程序执行的时间,以秒为单位。

需要注意的是,在使用clock函数时,我们需要将其返回值与一个类型为clock_t的变量进行赋值才能获取时钟周期数。如果我们直接使用clock函数的返回值,将无法得到正确的结果。

3. 避免clock函数的负数返回值

在某些情况下,clock函数可能会返回负数值,这将导致程序计算执行时间时出现错误。为了避免这种情况的发生,可以在程序开始前获取当前的处理器时钟周期数,并将其赋值给一个名为clocktick的全局变量。然后,在调用clock函数时,我们可以使用当前的处理器时钟周期数减去clocktick的值,这样就可以避免clock函数返回负数值了。

下面是一个避免clock函数返回负数值的示例代码:

“`c

#include

#include

clock_t clocktick;

int mn()

{

clock_t start, end;

double cpu_time_used;

clocktick = clock();

start = clock() – clocktick;

// 执行程序代码

end = clock() – clocktick;

cpu_time_used = ((double) (end – start)) / CLOCKS_PER_SEC;

printf(“CPU time used: %f\n”, cpu_time_used);

return 0;

}

“`

在这个示例代码中,我们首先在程序开始前获取当前的处理器时钟周期数,并将其赋值给一个名为clocktick的全局变量。然后,在程序开始时,我们将clock函数返回的处理器时钟周期数减去clocktick的值,得到程序开始时的处理器时钟周期数,并将其赋值给一个名为start的变量。程序结束后,我们同样也要将clock函数返回的处理器时钟周期数减去clocktick的值,得到程序结束时的处理器时钟周期数,并将其赋值给一个名为end的变量。我们再次通过计算end和start之间的差值,再除以一个常数CLOCKS_PER_SEC得到程序执行的时间,以秒为单位。

需要注意的是,在使用clocktick全局变量时,我们需要确保它仅在程序开始前被设置,并且在之后的程序代码中不再被更改或重新赋值。

本文介绍了如何正确使用C语言中的clock函数来计算程序的执行时间。我们了解到,clock函数返回的是处理器时钟计时器所经过的时钟周期数,而不是实际时间。在使用clock函数时,我们需要将其返回值与一个类型为clock_t的变量进行赋值才能获取时钟周期数。为了避免clock函数返回负数值,我们可以在程序开始前获取当前的处理器时钟周期数,并将其赋值给一个名为clocktick的全局变量,然后在调用clock函数时使用当前的处理器时钟周期数减去clocktick的值。

相关问题拓展阅读:

Linux怎样修改系统时间

使用“date -s”命令来修改系统时间

比如将系统时间设定成2023年8月1日的命令如下。

# date -s 08/01/2023

将系统时间设定成下午5点10分0秒的命令如下。

# date -s 17:10:00

这里说的是系统时间,是linux由操作系统维护的。

在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重起机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。

如果要确保修改生效可以执行如下命令。

# clock -w

或者

# hwclock

这个命令强制把系统时间写入CMOS。

***************************************************************************

Linux时钟的分类

Windows时钟大家可能十分熟悉了,Linux时钟在概念上类似Windows时钟显示当前系统时间,但在时钟分类和设置上却和Windows大相径庭。和Windows不同的是,Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种。系统时间是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的“Standard BIOS Feture”项中进行设置。

既然Linux有两个时钟系统,那么大家所使用的Linux默认使用哪种时钟系统呢?会不回出现两种系统时钟冲突的情况呢?这些疑问和担心不无道理。首先,Linux并没有默认哪个时钟系统。当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。

从Linux启动过程来看,系统时钟和硬件时钟不会发生冲突,但Linux中的所有命令(包括函数)都是采用的系统时钟设置。不仅如此,系统时钟和硬件时钟还可以采用异步方式,见图1所示,即系统时间和硬件时间可以不同。这样做的好处对于普通用户意义不大,但对于Linux网络管理员却有很大的用处。例如,要将一个很大的网络中(跨越若干时区)的服务器同步,假如位于美国纽约的Linux服务器和北京的Linux服务器,其中一台服务器无须改变硬件时钟而只需临时设置一个系统时间,如要将北京服务器上的时间设置为纽约时间,两台服务器完成文件的同步后,再与原来的时钟同步一下即可。这样系统和硬件时钟就提供了更为灵活的操作。

设置Linux的时钟

在Linux中,用于时钟查看和设置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。由于目前绝大多数用户使用x86硬件体系,所以可以视这两个命令为一个命令来学习。

1.在虚拟终端中使用date命令来查看和设置系统时间

查看系统时钟的操作:

# date

设置系统时钟的操作:

# date.30

通用的设置格式:

# date 月日时分年.秒

2.使用hwclock或clock命令查看和设置硬件时钟

查看硬件时钟的操作:

# hwclock –show 或

# clock –show

2023年09月17日 星期三 13时24分11秒 -0.seconds

设置硬件时钟的操作:

# hwclock –set –date=”09/17/:26:00″

或者

# clock –set –date=”09/17/:26:00″

通用的设置格式:hwclock/clock –set –date=“月/日/年 时:分:秒”。

3.同步系统时钟和硬件时钟

Linux系统(笔者使用的是Red Hat 8.0,其它系统没有做过实验)默认重启后,硬件时钟和系统时钟同步。如果不大方便重新启动的话(服务器通常很少重启),使用clock或hwclock命令来同步系统时钟和硬件时钟。

硬件时钟与系统时钟同步:

# hwclock –hctosys

或者

# clock –hctosys

上面命令中,–hctosys表示Hardware Clock to SYStem clock。

系统时钟和硬件时钟同步:

# hwclock –systohc

或者

# clock –systohc

修改linux的时间可以使用date指令   

修改日期:  

时间设定成2023年5月10日的命令如下:  #date -s 05/10/修改时间:  

将系统时间设定成上午10点18分0秒的命令如下。  #date -s 10:18:00   

修改时区: 

找到相应的时区文件 /usr/share/zoneinfo/Asia/Shanghai替换当前的/etc/localtime。  

修改/etc/sysconfig/clock文件的内容为:  ZONE=”Asia/Shanghai”  UTC=false  ARC=false   

同步bios时间:  同步BIOS时钟,强制把系统时间写入CMOS,命令如下:  #clock -w   date命令的功能是显示和设置系统日期和时间。 

输入date 查看目前系统时间。  

修改时间需要 date -功能字符

修改内容   命令中各选项的含义分别为:  

-d datestr, –date datestr 显示由datestr描述的日期  

-s datestr, –set datestr 设置datestr 描述的日期  

-u, –universal 显示或设置通用时间   

时间域  

%H 小时(00..23) 

%I 小时(01..12)  

%k 小时(0..23)  

%l 小时(1..12)  

%M 分(00..59)  

%p 显示出AM或PM  

%r 时间(hh:mm:ss AM或PM),12小时 

%s 从1970年1月1日00:00:00到目前经历的秒数  

%S 秒(00..59)  

%T 时间(24小时制)(hh:mm:ss) 

%X 显示时间的格式(%H:%M:%S) 

%Z 时区 日期域  

%a 星期几的简称( Sun..Sat)  

%A 星期几的全称( Sunday..Saturday) 

%b 月的简称(Jan..Dec) 

%B 月的全称(January..December)  

%c 日期和时间( Mon Nov 8 14:12:46 CST 1999) 

%d 一个月的第几天(01..31)  

%D 日期(mm/dd/yy)  

%h 和%b选项相同  

%j 一年的第几天(001..366) 

%m 月(01..12)  

%w 一个星期的第几天(0代表星期天)  

%W 一年的第几个星期(00..53,星期一为之一天)  

%x 显示日期的格式(mm/dd/yy)  

%y 年的最后两个数字( 1999则是99)  

%Y 年(例如:1970,1996等)   

需要特别说明的是,只有超级用户才能用date命令设置时间,一般用户只能用date命令显示时间。

你好~!系统修改时间在控制面板里的时间与日期里,进入修改为自己需要的时间即可,谢谢

1.首先输入date的时候,系统输出的是linux的当前时间

2.date -s 11/12/19

修改系统当前的日期为19年11月12日,注意这个命令会让你的时分秒置为00:00:00

3.date -s 23:43:20

将你的时间设置为23:43:20

4.date.06

将当前系统时间设置为2023年1月2日3点04分06秒

5.date.06

系统和第四步一样

求C语言程序:如何获得一个程序运行的时间? 更好带一段简单的代码 新人学不懂 呵呵 谢谢大家啦

clock()函数测试当前程序所使用的处理时间

#include “stdio.h”

#include “亮粗time.h”

#include

using namespace std;

int main()

{

clock_t start,stop;

double result;

long i=L;

start=clock();

while(i)

i–;

stop=clock();

result=(double)(stop-start)/宏郑CLOCKS_PER_SEC;

cout

调用sysinfo()获得系统启动以来经历的秒数时间。这个不属于高精度计时。

如果要进行高精度计时,高精度时间,C运行库的gettimeofday().(当然据我估计也是受到系统更改时间的影响)。

用绝对时间判断系统时间有没有被更改,用高精度时间精确计时,二者结合信祥高才是王道。

#include

#include

#include 改芹

void my_subroutine(long n) {

// timing a subroutine call:

char s;

for (long i = 0; i

#include

int main()

{

time_t t,t2;

t=time(&t);

…//程序段

t2=time(&t2);

printf(“程序运行时间%ld秒”,t2-t);

return 0;

linux c clock()的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux c clock(),Linux程序开发实用技巧: 如何正确使用C语言中的clock,Linux怎样修改系统时间,求C语言程序:如何获得一个程序运行的时间? 更好带一段简单的代码 新人学不懂 呵呵 谢谢大家啦的信息别忘了在本站进行查找喔。


数据运维技术 » Linux程序开发实用技巧: 如何正确使用C语言中的clock (linux c clock())