Ubuntu下C语言函数运行时间测试
鲲鹏应用开发考试(试卷编号131)
鲲鹏应用开发考试(试卷编号131)1.[单选题]关于镜像和容器的描述,以下哪项是不正确的?A)容器是动态的,可用容器来运行应用B)镜像是只读的, 可以理解为静态文件C)容器是由镜像实例化而来的D)容器不能拥有root权限,否则很不安全答案:D解析:2.[单选题]CPU Core 访问服务器上不同位[的内存时,内存访问延迟从高到低排序正确的是?A)跨Socket >跨NUMA不跨Socket > NUMA内B)NUMA内>跨NUMA不跨Socket >跨SocketC)跨NUMA不跨Socket >跨Socket > NUMA内D)跨Socket > NUMA内>跨NUMA不跨Socket答案:A解析:3.[单选题]在rpmbuli d的SPEC目录下,spec配置文件中用于将软件构建成机器代码(对于编译语言)或者字节代码的(对于解释性语言)命令是哪个?A)%filesB)%buildC)%installD)%clean答案:B解析:4.[单选题]为云开源镜像仓库中的依赖包更新周期间隔多久A)每月更新一次B)每周更新一次C)每年更新一次D)每天会随官方发布的版本进行更新答案:D解析:5.[单选题]通过华为鯤鹏性能优化工具对C/C++应用程序进行性能分析时,分析结果不包括的是?A)各个函数性能指标数据统计,以及函数代码映射信息B)任务执行时间、指令数、时钟周期、IPC等总体性能指标统计C)热点函数识别,以及函数火焰图解析:6.[单选题]Kunpeng920加速引擎不包括下列哪个?A)压缩加速引擎B)SSL加速引擎C)加密算法加速引擎D)重删加速引擎答案:D解析:7.[单选题]性能分析任务执行完成后,以下哪项是分析结果中无法查看到的?A)针对Top热点函数的性能优化建议B)函数火焰图C)Top 10热点函数性能指标数据D)分析过程中的采集日志答案:A解析:8.[单选题]GCC 升级../configure 命令后面的配置项哪一条是错误的是()A)--enable-checking=releaseB)--enable-languages=c,c++C)--disable-multilibD)--initialize-insecure答案:D解析:9.[单选题]以下哪个不是大数据的组件?A)ZookeeperB)KafkaC)StormD)Mariadb答案:D解析:10.[单选题]华为在哪一年拥有 ARMv8 架构的永久授权?()A)2013B)2016C)2015D)2017答案:B11.[单选题]鲲鹏处理器包含计算、存储、设备I0、中断以及虚拟化等子系统,这些子系统通过以下哪种方式互联?A)PCIe 4. 0网卡B)南桥控制器C)DDR4通道D)高速内部总线答案:D解析:12.[单选题]Docker是目前容器技术领域最热门的开源项目,下面哪项不属于Docker的基本概念?A)RepositoryB)ImageC)DeploymentD)Volume答案:C解析:13.[单选题]在鲲鹏平台中进行编译时,定义编译生成的应用程序为 64 位使用的参数是什么?A)-m32B)-mabi=1p64C)-mabi=1p32D)-m64答案:B解析:14.[单选题]使用Kunpeng Tuning kit鲲鹏性能优化工具做锁与等待分析时,是基于以下哪个工具采样的数据?A)sysbench的采样数据B)ab的采样数据C)WebBench的采样数据D)perf的采样数据答案:D解析:Tuning kit的进程线程性能分析:锁与等待分析,基于linux perf工具的采样数据。
C语言中的软件测试与调试方法与工具
C语言中的软件测试与调试方法与工具C语言作为一种广泛使用的编程语言,对于软件测试与调试的需求十分重要。
本文将介绍C语言中常用的软件测试和调试方法以及相关工具,帮助读者更加有效地开发和调试C语言程序。
一、单元测试(Unit Testing)单元测试是针对程序中最小的可测试单元进行测试的一种方法。
在C语言中,最小的可测试单元是函数。
通过编写各种测试用例,对函数进行测试并验证其各个功能的正确性。
1.1 断言(Assertion)断言是单元测试中常用的一种方法,通过在程序中插入断言语句来检测特定条件是否为真。
如果断言条件为假,则表示该处存在问题,并会发出相应的警告或错误信息。
例如,以下代码段展示了如何使用断言来测试一个简单的C语言函数:```c#include <stdio.h>#include <assert.h>int sum(int a, int b) {assert(a >= 0 && b >= 0); // 断言a和b都大于等于0return a + b;int main() {int result = sum(3, -2);printf("Sum: %d\n", result);return 0;}```在上述代码中,我们使用assert宏来实现断言,判断a和b是否都大于等于0。
如果不满足条件,程序将会中止并输出相应的错误信息。
1.2 测试框架(Testing Framework)为了更加方便地进行单元测试,C语言中存在一些测试框架,可以帮助开发者进行自动化测试。
常用的C语言测试框架包括Check、Unity和Google Test等,它们提供了丰富的断言和测试组织能力。
以Check测试框架为例,以下是一个简单的示例:```c#include <check.h>START_TEST(test_sum_positive_numbers) {int result = sum(3, 2);ck_assert_int_eq(result, 5);START_TEST(test_sum_negative_numbers) {int result = sum(-3, -2);ck_assert_int_eq(result, -5);}Suite *sum_suite() {Suite *suite = suite_create("Sum");TCase *test_case = tcase_create("Core");tcase_add_test(test_case, test_sum_positive_numbers); tcase_add_test(test_case, test_sum_negative_numbers); suite_add_tcase(suite, test_case);return suite;}int main() {Suite *suite = sum_suite();SRunner *runner = srunner_create(suite);srunner_run_all(runner, CK_VERBOSE);int failed_count = srunner_ntests_failed(runner);srunner_free(runner);return (failed_count == 0) ? 0 : 1;}```上述代码使用了Check测试框架来进行单元测试。
Linux操作系统下的C语言开发环境搭建测试题
Linux操作系统下的C语言开发环境搭建测试题(答案见尾页)一、选择题1. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?A. 安装GCC编译器B. 设置环境变量C. 编译和运行C程序D. 配置终端2. 在Linux操作系统中,以下哪个命令可以用来编译和运行C程序?A. gccB. g++C. chmodD. make3. 在Linux操作系统中,如何修改默认的编译器路径?A. 修改PATH环境变量B. 使用export命令C. 编辑/etc/profile文件D. 修改gcc的配置文件4. 在Linux操作系统中,安装了GCC编译器后,如何验证其安装成功?A. 输入gcc --version命令B. 输入gcc -v命令C. 输入gcc --configure命令D. 输入gcc -E命令5. 在Linux操作系统中,如何配置终端以方便进行C语言编程?A. 更改终端的提示符B. 安装tmux或screen工具C. 配置bashrc文件6. 在Linux操作系统中,如何使用GDB调试器调试C程序?A. 安装gdb软件包B. 编译程序时添加-g选项C. 使用gdb命令启动程序D. 查看程序内存布局7. 在Linux操作系统中,如何查看源代码文件的内容?A. 使用cat命令B. 使用less命令C. 使用grep命令D. 使用find命令8. 在Linux操作系统中,如何使用vi编辑器编辑C语言源代码文件?A. 进入vi编辑器B. 编辑文件内容C. 保存文件并退出vi编辑器D. 检查文件是否已保存9. 在Linux操作系统中,如何通过FTP上传和下载文件?A. 使用ftp命令B. 使用sftp命令C. 使用scp命令D. 使用ls命令10. 在Linux操作系统中,如何设置用户权限以确保C语言源代码的安全?A. 使用chmod命令B. 使用chown命令C. 使用umask命令D. 使用acl命令11. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?B. 设置环境变量C. 配置编译选项D. 编译和运行C程序12. 在Linux系统下,如何修改一个文件的权限使其可读可写?A. chmod 666 filenameB. chmod 777 filenameC. chmod 644 filenameD. chmod 755 filename13. 在Linux系统下,使用以下哪个命令可以查看文件的详细信息,如文件大小、创建日期等?A. ls -lB. df -hC. tar -xvf file.tarD. stat filename14. 在Linux系统下,如何使用vi编辑器打开一个文件?A. vi filenameB. vim filenameC. nano filenameD. emacs filename15. 在Linux系统下,安装了GCC编译器后,如何验证其是否正确安装?A. echo $PATHB. which gccC. gcc --versionD. all of the above16. 在Linux系统下,如何创建一个新的目录并进入该目录?A. mkdir new_directoryB. cd new_directoryC. rmdir new_directoryD. mkdir -p new_directory17. 在Linux系统下,如何使用grep命令在文本中搜索特定的字符串?A. grep "search_string" filenameB. grep "search_string" filename | lessC. grep "search_string" filename | moreD. all of the above18. 在Linux系统下,如何修改一个文件的换行符为LF(Unix风格)?A. dos2unix filenameB. unix2dos filenameC. cat filename | tr '' '' > filenameD. all of the above19. 在Linux系统下,如何使用find命令查找特定文件?A. find / -name "filename_pattern"B. find . -type f -name "filename_pattern"C. find / -name "filename_pattern" -printD. all of the above20. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?A. 安装编译器B. 配置编译环境变量C. 安装文本编辑器D. 编写、编译和运行C源代码21. 在Linux操作系统下,以下哪个命令可以用来编译和运行C语言源代码?A. gccB. g++C. chmodD. make22. 在Linux操作系统下,以下哪个命令可以用来安装一个新的C语言库?A. apt-getB. yumC. pacman23. 在Linux操作系统下,以下哪个命令可以用来查看源代码的层次结构?A. catB. grepC. treeD. less24. 在Linux操作系统下,以下哪个命令可以用来创建一个新目录?A. mkdirB. rmdirC. touchD. cp25. 在Linux操作系统下,以下哪个命令可以用来删除一个文件?A. rmB. mvC. rmdirD. cp26. 在Linux操作系统下,以下哪个命令可以用来复制文件或目录?A. cpB. mvC. rmD. ln27. 在Linux操作系统下,以下哪个命令可以用来查看文件的内容?A. catB. grepC. lessD. head28. 在Linux操作系统下,以下哪个命令可以用来查找文件?A. findB. locateD. man29. 在Linux操作系统下,以下哪个命令可以用来查看当前目录的内容?A. lsB. cdC. pwdD. man30. Linux操作系统下,C语言开发环境的搭建需要哪些步骤?A. 安装GCC编译器B. 配置内核头文件C. 安装文本编辑器D. 配置终端环境31. 在Linux操作系统下,如何验证C语言编译成功?A. 编译一个简单的C源代码,观察是否有语法错误B. 使用命令行进入编译后的目录,查看生成的可执行文件C. 在终端中输入编译命令,观察是否有错误信息D. 将编译后的程序在另一个系统中运行,检查功能是否实现32. Linux操作系统下,C语言开发常用的文本编辑器有哪些?A. VimB. EmacsC. nanoD. Kate33. 在Linux操作系统下,如何配置终端环境以便于C语言编程?A. 设置默认编码为UTF-8B. 配置PATH环境变量,确保编译器路径已添加C. 安装并配置版本控制工具(如Git)D. 配置别名,提高编程效率34. 在Linux操作系统下,C语言开发中常用的调试工具有哪些?A. GDB调试器B. DDD调试工具C. Valgrind内存检测工具D. printf()函数调试35. Linux操作系统下,C语言开发环境的搭建过程中,如何配置网络连接?A. 修改网络配置文件,设置静态IP地址B. 关闭防火墙,确保端口畅通C. 配置DNS服务器,解析域名D. 使用Wireshark工具监控网络流量36. 在Linux操作系统下,C语言开发环境中,如何管理项目文件?A. 使用版本控制工具(如Git)进行项目管理B. 使用文件系统树形结构管理项目文件C. 使用目录和文件名来管理项目文件D. 使用标签系统管理项目文件37. Linux操作系统下,C语言开发环境的搭建完成后,如何优化编译速度?A. 升级GCC编译器到最新版本B. 优化编译选项,减少编译时间C. 使用增量编译,避免重复编译D. 使用并行编译,提高编译速度38. 在Linux操作系统下,C语言开发环境的搭建过程中,如何安装必要的库文件?A. 使用包管理器(如apt或yum)安装库文件B. 从官方网站下载库文件并手动安装C. 从源代码编译库文件并安装D. 使用静态链接库文件,减少动态链接的内存开销39. Linux操作系统下,C语言开发环境的搭建完成后,如何进行代码测试和调试?A. 使用GDB调试器进行单步调试B. 使用DDD调试工具查看内存状态C. 使用printf()函数打印变量值进行调试D. 使用单元测试框架进行自动化测试40. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?A. 安装GCC编译器B. 配置环境变量C. 安装文本编辑器D. 编译和运行C程序41. 在Linux操作系统下,以下哪个命令可以用来查看系统中的所有进程?A. ps -efB. topC. freeD. all42. 在Linux操作系统下,如何修改一个文件的权限使得文件所有者具有读写权限,其他用户只具有读权限?A. chmod 644 filenameB. chmod 755 filenameC. chmod 664 filenameD. chmod 777 filename43. 在Linux操作系统下,使用以下哪个命令可以查看当前目录下的隐藏文件?A. ls -aB. ls -lC. ls -hD. ls -d44. 在Linux操作系统下,如何安装一个新软件包?A. apt-get updateB. yum install package_nameC. pacman -S package_nameD. brew install package_name45. 在Linux操作系统下,如何使用grep命令查找包含特定字符串的文件?A. grep "search_string" filenameB. grep "search_string" /path/to/filenameC. grep "search_string" $(find /path/to/search -type f)D. grep "search_string" /path/to/search/*46. 在Linux操作系统下,如何修改文件的所有者和组?A. chown new_owner:new_group filenameB. chown new_owner:new_group /C. chown new_owner:new_group *D. chown new_owner:new_group .47. 在Linux操作系统下,如何创建一个新的用户组?A. groupadd group_nameB. groupadd -g GID group_nameC. groupadd -G GID group_nameD. groupadd -p group_name48. 在Linux操作系统下,如何设置Shell提示符?A. export PS1="\u@\h:\w\$ "B. export PS1="\u@\h:\w\$ "C. export PS1="\u@\h:\w\\$ "D. export PS1="\u@\h:\w\$ "二、问答题1. 请简述在Linux操作系统下搭建C语言开发环境的步骤。
c语言中exp函数执行时间
c语言中exp函数执行时间
C语言中的exp函数是用来计算自然对数的指数函数的,其执
行时间取决于具体的实现和运行环境。
一般来说,exp函数的执行
时间与输入参数的大小有关。
对于较小的输入参数,exp函数的执
行时间可能会比较快,因为计算的复杂度较低。
而对于较大的输入
参数,exp函数的执行时间可能会增加,因为需要进行更多的计算
操作。
在一些C语言的实现中,exp函数可能会利用一些近似计算的
技巧来提高计算速度,这可能会影响其执行时间。
另外,编译器的
优化也会对exp函数的执行时间产生影响。
一些优化手段可能会使exp函数的执行时间更短,但并不是所有的编译器都会进行这样的
优化。
总的来说,exp函数的执行时间是一个复杂的问题,受到多种
因素的影响,包括输入参数的大小、具体的实现方式、编译器的优
化等等。
因此很难给出一个准确的数字来描述exp函数的执行时间。
如果需要对exp函数的执行时间进行精确的分析,可能需要具体针
对某个实现和运行环境进行测试和测量。
计算时间差的函数C语言实现
计算时间差的函数C语⾔实现// TimeTest.cpp : 定义控制台应⽤程序的⼊⼝点。
//#include "stdafx.h"#include <windows.h>#include <cmath>#include <ctime>#include <stdio.h>#include<time.h>#include "math.h"//计算给定的时间是本年的第⼏秒int count(int year,int month,int day,int hour,int minter,int second){int i,sum=0,flag=0;int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};for(i=1;i<month;i++)sum=(a[i]*86400+sum);//⾮闰年年初到当前⽉的总秒数if(year%400==0||year%100!=0&&year%4==0)flag=1;if(flag==1&&month>2)//sum++;sum=sum+86400;//多⼀天的秒数sum=sum+(day-1)*86400;//加上本⽉⽉初到今天剩余的秒数sum=sum+(hour-1)*3600;//加上当前⼩时数sum=sum+(minter-1)*60;//加上当前分数sum=sum+second;//加上当前秒数return sum;}int _tmain(int argc, _TCHAR* argv[]){while(1){int year,month,day,hour,minter,second;time_t t;struct tm *local;int sum=0,i;t=time(NULL);local=localtime(&t);printf("现在的时间:%d年%d⽉%d⽇%d时%d分%d秒\n",local->tm_year+1900,local->tm_mon+1,local->tm_mday,local->tm_hour,local->tm_min,local->tm_sec);printf("输⼊时间:");scanf("%d%d%d%d%d%d",&year,&month,&day,&hour,&minter,&second);for(i=year+1;i<local->tm_year+1900;i++){if(i%400==0||i%100!=0&&i%4==0)sum+=366*86400;else sum+=365*86400;//sum是计算间隔年之间的秒数}sum=abs((year-(local->tm_year+1900))*86400)+abs(count(year,month,day,hour,minter,second)-count(local->tm_year+1900,local->tm_mon+1,local->tm_mday,local->tm_hour,local->tm_min,local->tm_sec));printf("%d年%d⽉%d⽇%d时%d分%d秒距刚才有%d秒\n",year,month,day,hour,minter,second,sum);}return 0;}。
c和c++在windows下获取时间和计算时间差的方法总结
c/c++在windows下获取时间和计算时间差的几种方法总结一、标准C和C++都可用1、获取时间用time_t time( time_t * timer ),计算时间差使用doubledifftime( time_t timer1, time_t timer0 )。
精确到秒。
测试程序如下:1.#include <time.h>2.#include <stdio.h>3.int main()4.{5. time_t start ,end ;6.double cost;7. time(&start);8. sleep(1);9. time(&end);10. cost=difftime(end,start);11. printf("%f\n",cost);12.return 0;13.}本程序在fedora9测试通过。
关于代码中的sleep函数,需要注意的是:1)在windows下,为Sleep()函数,且需包含windows.h2)关于sleep中的数,在Windows和Linux下1000代表的含义并不相同,Windows 下的表示1000毫秒,也就是1秒钟;Linux下表示1000秒,Linux下使用毫秒级别的函数可以使用usleep。
2、clock_t clock()clock() 获取的是计算机启动后的时间间隔,得到的是CPU时间,精确到1/CLOCKS_PER_SEC秒。
测试程序如下:1.#include <time.h>2.#include <stdio.h>3.int main()4.{5.double start,end,cost;6. start=clock();7. sleep(1);8. end=clock();9. cost=end-start;10. printf("%f\n",cost);11.return 0;12.}二、C++中(此处针对windows环境,标准c中则linux和windows都可以)1、GetTickCount()调用函数需包含windows.h。
C语言计算程序运行时间
C语言计算程序运行时间clock(函数返回的是一个CLOCKS_PER_SEC宏定义的时钟周期数,表示每秒钟的时钟周期数。
通过使用clock(函数,我们可以获取程序运行的起始时间和结束时间,然后计算两者之间的差值,即可得到程序的运行时间。
下面是一个使用clock(函数计算程序运行时间的示例代码:```c#include <stdio.h>int maiclock_t start, end;start = clock(; // 获取程序开始时间//以下是程序的主要代码int sum = 0;sum += i;}//程序主要代码结束end = clock(; // 获取程序结束时间return 0;```在上面的示例代码中,我们首先声明了两个clock_t类型的变量start和end,用于存储程序开始和结束的时钟时间。
然后,在程序执行前使用clock(函数获取程序开始的时钟时间,并将其赋值给start变量。
接着,在程序的主要代码部分,我们进行了一些耗时的操作(本例中是一个求和操作),这部分代码是我们希望计算运行时间的代码。
最后,在程序主要代码结束后使用clock(函数获取程序结束的时钟时间,并将其赋值给end变量。
通过计算end和start之间的差值,并除以CLOCKS_PER_SEC,我们可以得到程序运行的总时间(以秒为单位)。
最后,我们使用printf函数将运行时间打印出来。
在上述示例中,使用了整数求和的操作作为耗时的示例代码,你可以根据需要替换为实际的耗时操作。
使用clock(函数计算程序运行时间的原理是一样的,只需要在程序的开始和结束处添加相应的代码即可。
C语言获取当前系统时间的几种方式
C语言中如何获取时间?精度如何?1 使用time_t time( time_t * timer ) 精确到秒2 使用clock_t clock() 得到的是CPU时间精确到1/CLOCKS_PER_SEC秒3 计算时间差使用double difftime( time_t timer1, time_t timer0 )4 使用DWORD GetTickCount() 精确到毫秒5 如果使用MFC的CTime类,可以用CTime::GetCurrentTime() 精确到秒6 要获取高精度时间,可以使用BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)获取系统的计数器的频率BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)获取计数器的值然后用两次计数器的差除以Frequency就得到时间。
7 Multimedia Timer FunctionsThe following functions are used with multimedia timers.timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime//*********************************************************************//用标准C实现获取当前系统时间的函数一.time()函数time(&rawtime)函数获取当前时间距1970年1月1日的秒数,以秒计数单位,存于rawtime 中。
#include "time.h"void main (){time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );printf ( "\007The current date/time is: %s", asctime (timeinfo) );exit(0);}=================#include -- 必须的时间函数头文件time_t -- 时间类型(time.h 定义是typedef long time_t; 追根溯源,time_t是long)struct tm -- 时间结构,time.h 定义如下:int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;time ( &rawtime ); -- 获取时间,以秒计,从1970年1月一日起算,存于rawtimelocaltime ( &rawtime ); -- 转为当地时间,tm 时间结构asctime ()-- 转为标准ASCII时间格式:星期月日时:分:秒年-----------------------------------------------------------------------------二.clock()函数,用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。
鲲鹏应用开发考试(习题卷8)
鲲鹏应用开发考试(习题卷8)说明:答案和解析在试卷最后第1部分:单项选择题,共39题,每题只有一个正确答案,多选或少选均不得分。
1.[单选题]在鲲鹏平台上准备C语言的开发环境,需要部署以下哪种工具?A)JDKB)GCCC)wgetD)maven2.[单选题]鲲鹏分析扫描工具DependencyAdvisor不能安装在以下哪种操作系统上。
A)中标麒麟V7R6B)CentOS7.6C)RedHat7.0D)深之度15.23.[单选题]以下选项中,哪项不是华为云对象存储服务OBS的特点A)大宽带,支撑大数据业务的性能要求。
B)高可靠C)按照64MB每块,分块存储数据。
D)支持100KM同城多机房多活。
4.[单选题]下列鲲鹏生态包含的产品中哪个不是华为已经或者即将要做开源的?A)GaussDB 0LTP单机版B)openEul er操作系统C)MindSore AI框架D)Kunpeng 920处理器架构5.[单选题]以下哪个计划是华为围绕TaiShan服务器推出的?A)鲲鹏飞天伙伴计划B)鲲鹏凌云伙伴计划C)鲲鹏智数伙伴计划D)鲲鹏展翅伙伴计划6.[单选题]下列关于鲲鹏应用发布后期所需要的维护工作描述正确的是哪个?A)每升级一次版本需将老版本下线B)对应用生命周期进行管理,到期即下线所有版本C)保证应用版本的及时更新,维护长期稳定版本D)根据实际情况调整应用版本,但应用生命周期规划不能更改7.[单选题]以下哪个不是使用 rpm 工具安装软件?A)自动安装依赖包B)全自动安装C)能够进行数据库的记载D)自定义安装路径8.[单选题]在基于编译型语言的鲲鹏应用发布流程中,下列选项哪个是编译阶段最关注的?A)发布是否成功B)是否打包成rpm包C)编译后的二进制文件是否成功运行D)是否有足够的资源运行9.[单选题]哪些场景使适用于HTTPS的短连接类型?A)视频直播B)聊天对话C)网站电影播放D)视频通话10.[单选题]系统盘镜像类型不包含以下哪个?A)普通云服务器系统盘镜像B)GPU加速云服务器系统盘镜像C)裸金属云服务器系统盘镜像D)云服务器教据盘镜像11.[单选题]鲲鹏920处理器L3的CacheLine为多少字节?A)256B)32C)64D)12812.[单选题]下列关于TaiShan服务器的说法正确的是?A)TaiShan X6000的XA320计算节点支持水冷散热。
cc++测试函数的运行时间(八种方法)
cc++测试函数的运⾏时间(⼋种⽅法)⽬前,存在着各种计时函数,⼀般的处理都是先调⽤计时函数,记下当前时间tstart,然后处理⼀段程序,再调⽤计时函数,记下处理后的时间tend,再tend和tstart做差,就可以得到程序的执⾏时间,但是各种计时函数的精度不⼀样.下⾯对各种计时函数,做些简单记录.void foo(){long i;for (i=0;i<100000000;i++){long a= 0;a = a+1;}}⽅法1,time()获取当前的系统时间,返回的结果是⼀个time_t类型,其实就是⼀个⼤整数,其值表⽰从CUT(Coordinated Universal Time)时间1970年1⽉1⽇00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数.void test1(){time_t start,stop;start = time(NULL);foo();//dosomethingstop = time(NULL);printf("Use Time:%ld\n",(stop-start));}⽅法2,clock()函数返回从“开启这个程序进程”到“程序中调⽤clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)常量CLOCKS_PER_SEC,它⽤来表⽰⼀秒钟会有多少个时钟计时单元。
void test2(){double dur;clock_t start,end;start = clock();foo();//dosomethingend = clock();dur = (double)(end - start);printf("Use Time:%f\n",(dur/CLOCKS_PER_SEC));}如果你想学习C/C++可以来这个群,⾸先是三三零,中间是⼋五九,最后是七六六,⾥⾯有⼤量的学习资料可以下载。
c语言耗时的计算
c语言耗时的计算C语言是一种高级编程语言,广泛应用于计算机科学和软件开发领域。
在编写C语言程序时,我们经常需要考虑程序的执行效率和耗时。
本文将探讨如何计算C语言程序的耗时,并提供一些优化技巧。
在计算C语言程序的耗时之前,我们需要了解一些基本概念。
首先是时钟周期,它是计算机处理器执行一条指令所需的时间。
通常,时钟周期的频率以赫兹(Hz)为单位表示,例如1 GHz表示每秒执行10亿个时钟周期。
其次是时钟频率,它表示处理器的工作频率,即每秒钟执行的时钟周期数。
在C语言中,我们可以使用时间函数来计算程序的耗时。
标准库函数time.h提供了一些与时间相关的函数,其中常用的有clock()函数和difftime()函数。
clock()函数返回程序执行开始至调用时的时钟周期数,而difftime()函数计算两个时间之间的差值。
为了计算C语言程序的耗时,我们可以按照以下步骤进行:1. 在程序开始时调用clock()函数,记录程序执行开始的时钟周期数。
2. 在程序结束时再次调用clock()函数,记录程序执行结束的时钟周期数。
3. 使用difftime()函数计算两个时间之间的差值,得到程序的耗时。
下面是一个示例程序,演示如何使用clock()函数计算程序的耗时:```#include <stdio.h>#include <time.h>int main() {clock_t start, end;double cpu_time_used;// 记录程序开始执行的时钟周期数start = clock();// 在这里编写你的程序代码// 记录程序结束执行的时钟周期数end = clock();// 计算程序的耗时cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("程序的耗时为 %f 秒\n", cpu_time_used);return 0;}```在上述示例中,我们首先声明了三个变量:start、end和cpu_time_used。
c语言 时间函数
c语言时间函数时间是我们生活中一个非常重要的概念,我们总是需要知道时间的流逝,以便安排我们的日常活动和计划。
在计算机编程领域,时间同样也非常重要。
C语言提供了一些函数来帮助我们获取和操作时间,这些函数被称为时间函数。
1. time()函数time()函数是C语言中最常用的时间函数之一。
它返回自1970年1月1日以来经过的秒数。
通常情况下,我们使用time()函数来获取当前的时间戳。
2. localtime()函数localtime()函数将一个时间戳转换为本地时间。
它接受time()函数返回的时间戳作为参数,并返回一个指向tm结构体的指针,该结构体包含了年、月、日、时、分、秒等信息。
3. strftime()函数strftime()函数可以将时间格式化为字符串。
它接受一个格式化字符串作为参数,并根据这个格式化字符串将时间转换为指定的格式。
例如,我们可以使用"%Y-%m-%d %H:%M:%S"来将时间格式化为"年-月-日时:分:秒"的形式。
4. mktime()函数mktime()函数与localtime()函数相反,它将一个tm结构体转换为时间戳。
我们可以使用mktime()函数将一个包含年、月、日、时、分、秒等信息的tm结构体转换为一个表示时间的秒数。
5. difftime()函数difftime()函数可以计算两个时间之间的差值。
它接受两个时间戳作为参数,并返回它们之间的差值,单位为秒。
6. clock()函数clock()函数用于测量程序运行的时间。
它返回程序运行的时钟周期数,单位为毫秒。
通过测量程序开始和结束之间的时钟周期数差值,我们可以计算出程序的运行时间。
7. sleep()函数sleep()函数用于让程序暂停执行一段时间。
它接受一个整数作为参数,表示暂停的秒数。
通过调用sleep()函数,我们可以让程序在执行到某个地方时暂停一段时间,然后再继续执行。
c统计时间的函数
C统计时间的函数1. 函数的定义C统计时间的函数指的是一类C语言中用于测量程序执行时间的函数。
这些函数可以精确测量程序的运行时间,包括整个程序的执行时间、函数的执行时间等。
2. 函数的用途C统计时间的函数主要用于性能分析、程序优化和调试等方面。
通过测量程序的执行时间,可以确定程序中的瓶颈、找出耗时较多的函数或代码块,并对其进行优化。
此外,还可以通过比较不同算法或实现方式的执行时间,选择性能最优的解决方案。
对于调试来说,通过测量函数的执行时间,可以判断函数是否超时或是否符合要求。
3. 常用的统计时间的函数在C语言中,常用的统计时间的函数有以下几种:(1) clock()函数原型:clock_t clock(void);函数的定义:clock()函数用于返回程序运行的时钟时间,单位为CLOCKS_PER_SEC (每秒钟的时钟周期数)。
在大多数系统中,CLOCKS_PER_SEC的值为1000000(即每秒钟有1000000个时钟周期)。
函数的用途:clock()函数主要用于测量程序的执行时间,可以通过计算两次调用clock()函数之间的差值来计算程序的运行时间。
函数的工作方式:clock()函数通过读取计算机系统中的时钟信息来获取程序的运行时间。
在函数调用开始时,使用计时器记录一个起始时间点;在函数调用结束时,再次使用计时器记录一个结束时间点。
然后,用结束时间点减去起始时间点,得到程序的执行时间。
(2) time()函数原型:time_t time(time_t *tloc);函数的定义:time()函数返回从1970年1月1日00:00:00经过了多少秒。
函数的用途:time()函数主要用于获取当前系统的时间,可以用于记录日志、计算两个时间点之间的时间差等。
函数的工作方式:time()函数调用后,会返回一个time_t类型的值,表示当前系统的时间。
如果传递了一个指针参数tloc,则会将返回值存储在该指针指向的变量中。
c语言计算程序运行时间的方法
c语⾔计算程序运⾏时间的⽅法1. 有时候我们要计算程序执⾏的时间.⽐如我们要对算法进⾏时间分析,这个时候可以使⽤下⾯这个函数.精确到us。
#include <sys/time.h>int gettimeofday(struct timeval *tv,struct timezone *tz);strut timeval {long tv_sec; /* 秒数 */long tv_usec; /* 微秒数 */};gettimeofday将时间保存在结构tv之中.tz⼀般我们使⽤NULL来代替.#include <sys/time.h<#include <stdio.h<#include <math.h<void function(){unsigned int i,j;double y;for(i=0;i<1000;i++)for(j=0;j<1000;j++)y=sin((double)i);}main(){struct timeval tpstart,tpend;float timeuse;gettimeofday(&tpstart,NULL);function();gettimeofday(&tpend,NULL);timeuse=1000000*(__sec)+__usec;timeuse/=1000000;printf("Used Time:%f\n",timeuse);exit(0);}这个程序输出函数的执⾏时间,我们可以使⽤这个来进⾏系统性能的测试,或者是函数算法的效率分析.在我机器上的⼀个输出结果是: Used Time:0.5560702.第⼆种是我⾃⼰经常⽤的,就是:在执⾏程序前,加time,如:输⼊time./abc ,精确到ms。
3. clock函数(精确到1/CLOCKS_PER_SEC秒,毫秒级)#include <iostream>#include <ctime>using namespace std;int max(int x,int y){return (x>y)?x:y;}int main(){const double begin=clock();for(int i=10000;i>0;i--)for(int j=10000;j>0;j--)max(i,j);const double end=clock();cout <<begin<<" "<<end;return 0;}。
C中计算程序运行时间差(毫秒级)
C中计算程序运⾏时间差(毫秒级)最近在跑⼀些程序,需要计算程序运⾏的时间,然后搜索了⼀下相关的材料,发现下⾯的⼀个⽐较好的⽅法,可以实现毫秒级的计时:#include <sys/timeb.h>#if defined(WIN32)# define TIMEB _timeb# define ftime _ftime#else#define TIMEB timeb#endiftime_t ltime1, ltime2, tmp_time;struct TIMEB tstruct1, tstruct2;ftime (&tstruct1); // start time mstime (<ime1); // start time s//worktime (<ime2); // end time secftime (&tstruct2); // end time mstmp_time = (ltime2 * 1000 + litm) - (ltime1 * 1000 + litm);更新:2012年2⽉25⽇ 12时34分28秒下⾯的代码是⼀个可以在windows和linux平台下进⾏毫秒级计时的程序。
程序中是进⾏上万次的内存分配来耗时,演⽰计时的⽅法的。
毫秒级的计时的主要使⽤的函数ftime,使⽤ftime可以得到当前时间的毫秒和秒,从⽽我们可以得到毫秒级的计时。
但是如果要以毫秒为单位输出时间的话,必须使⽤64位的数据类型来表⽰。
在linux上是long long,⽽windows下是使⽤__int64.并且如果使⽤printf的话,需要使⽤64位情况下对应的输出⽅式。
不然会输出负数,这时就是溢出了。
linux下是:printf("%lld",n)windows下是:printf(“%I64d",n)#include <stdio.h>#include <sys/timeb.h>#include <stdlib.h>#if defined(WIN32)# define TIMEB _timeb# define ftime _ftimetypedef __int64 TIME_T;#else#define TIMEB timebtypedef long long TIME_T;#endifint time_interval(){struct TIMEB ts1,ts2;TIME_T t1,t2;int ti;ftime(&ts1);//开始计时//do some work{int i;for(i=0;i<100000;i++){int *p=malloc(10000);int *q=malloc(10000);int *s=malloc(10000);int *t=malloc(10000);free(p);free(q);free(s);free(t);}}ftime(&ts2);//停⽌计时t1=(TIME_T)ts1.time*1000+litm;printf("t1=%lld\n",t1);t2=(TIME_T)ts2.time*1000+litm;printf("t2=%lld\n",t2);ti=t2-t1;//获取时间间隔,ms为单位的return ti;}int main(){int ti=time_interval();printf("time interval=%d\n",ti);}不过其实如果只是单纯的获得时间的间隔的话,也不⽤考虑64位的问题,因为将两个时间的秒⼀级的耗时相减的话结果就⽐较⼩了,代码如下:#include <stdio.h>#include <sys/timeb.h>#include <stdlib.h>#if defined(WIN32)# define TIMEB _timeb# define ftime _ftime#else#define TIMEB timeb#endifint time_interval(){struct TIMEB ts1,ts2;time_t t_sec,ti;ftime(&ts1);//开始计时//do some work{int i;for(i=0;i<100000;i++){int *p=malloc(10000);int *q=malloc(10000);int *s=malloc(10000);int *t=malloc(10000);free(p);free(q);free(s);free(t);}}ftime(&ts2);//停⽌计时t_sec=ts2.time-ts1.time;//计算秒间隔t_ms=litm;//计算毫秒间隔ti=t_sec*1000+t_ms;return ti;}int main(){int ti=time_interval();printf("time interval=%d\n",ti);}。
ubuntuLinux下C语言open函数打开或创建文件与read,write函数详细讲解
ubuntuLinux下C语⾔open函数打开或创建⽂件与read,write函数详细讲解open(打开⽂件)相关函数read,write,fcntl,close,link,stat,umask,unlink,fopen表头⽂件#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>定义函数int open( const char * pathname, int flags);int open( const char * pathname,int flags, mode_t mode);函数说明参数pathname 指向欲打开的⽂件路径字符串。
下列是参数flags 所能使⽤的旗标:O_RDONLY 以只读⽅式打开⽂件O_WRONLY 以只写⽅式打开⽂件O_RDWR 以可读写⽅式打开⽂件。
上述三种旗标是互斥的,也就是不可同时使⽤,但可与下列的旗标利⽤OR(|)运算符组合。
O_CREAT 若欲打开的⽂件不存在则⾃动建⽴该⽂件。
O_EXCL 如果O_CREAT也被设置,此指令会去检查⽂件是否存在。
⽂件若不存在则建⽴该⽂件,否则将导致打开⽂件错误。
此外,若O_CREAT与O_EXCL同时设置,并且欲打开的⽂件为符号连接,则会打开⽂件失败。
O_NOCTTY 如果欲打开的⽂件为终端机设备时,则不会将该终端机当成进程控制终端机。
O_TRUNC 若⽂件存在并且以可写的⽅式打开时,此旗标会令⽂件长度清为0,⽽原来存于该⽂件的资料也会消失。
O_APPEND 当读写⽂件时会从⽂件尾开始移动,也就是所写⼊的数据会以附加的⽅式加⼊到⽂件后⾯。
O_NONBLOCK 以不可阻断的⽅式打开⽂件,也就是⽆论有⽆数据读取或等待,都会⽴即返回进程之中。
O_NDELAY 同O_NONBLOCK。
O_SYNC 以同步的⽅式打开⽂件。
O_NOFOLLOW 如果参数pathname 所指的⽂件为⼀符号连接,则会令打开⽂件失败。
Linux+Qt算法运行时间(计时函数)
Linux+Qt算法运行时间(计时函数)【问题描述】程序运行时间是编程的一项重要指标,如何测算程序的运行时间呢?【解析】1.#include <chrono>ing namespace std;ing namespace chrono;4.auto start = system_clock::now();5.// do something...6.auto end = system_clock::now();7.auto duration = duration_cast<microseconds>(end - start);8.cout << "花费了"<< double(duration.count())<< "毫秒" << endl;测试函数[html] view plaincopy1.#include <math.h>2.3.void function()4.{5.unsigned int i,j;6.double y;7.8.for(i=0;i<1000;i++)9.for(j=0;j<1000;j++)10.y=sin((double)i);11.}方法1如果在QT中,利用QTime,其精度为ms级----------在QT中使用。
[html] view plaincopy1.#include <QDebug>2.#include <QTime>3.4.QTime time;5.6.time.start();7.function();8.9.qDebug()<<time.elapsed()/1000.0<<"s";运行结果:0.109 s方法2利用gettimeofday(),其精度为us级----------C语言实现,在C++环境、QT、VC中也能用。
C语言中时间的函数
C语言中时间的函数C语言中关于时间的函数C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
下面是店铺分享的C语言中关于时间的函数,一起来看一下吧。
一.概念在C/C++中,通过学习许多C/C++库,你可以有很多操作、使用时间的方法。
但在这之前你需要了解一些“时间”和“日期”的概念,主要有以下几个:1. 协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。
比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。
美国是UTC-5。
2. 日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。
这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。
3. 时间点。
时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。
4. 时钟计时单元(而不把它叫做时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的。
一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。
我们可以使用ANSI标准库中的time.h头文件。
这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的C语言风格。
下面,我将说明在C/C++中怎样使用日期的时间功能。
二. 介绍1. 计时C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。
在MSDN中,查得对clock函数定义如下:clock_t clock( void );这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。
VC++获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法
VC++获取系统时间、程序运⾏时间(精确到秒,毫秒)的五种⽅法1.使⽤CTime类(获取系统当前时间,精确到秒)CString str;//获取系统时间CTime tm;tm=CTime::GetCurrentTime();//获取系统⽇期str=tm.Format("现在时间是%Y年%m⽉%d⽇ %X");MessageBox(str,NULL,MB_OK);a,从CTimet中提取年⽉⽇时分秒CTime t = CTime::GetCurrentTime(); int d=t.GetDay(); //获得⼏号 int y=t.GetYear(); //获取年份 int m=t.GetMonth(); //获取当前⽉份 int h=t.GetHour(); //获取当前为⼏时 int mm=t.GetMinute(); //获取分钟 int s=t.GetSecond(); //获取秒 int w=t.GetDayOfWeek(); //获取星期⼏,注意1为星期天,7为星期六b,计算两段时间的差值,可以使⽤CTimeSpan类,具体使⽤⽅法如下:CTime t1( 1999, 3, 19, 22, 15, 0 );CTime t = CTime::GetCurrentTime();CTimeSpan span=t-t1; //计算当前系统时间与时间t1的间隔int iDay=span.GetDays(); //获取这段时间间隔共有多少天int iHour=span.GetTotalHours(); //获取总共有多少⼩时int iMin=span.GetTotalMinutes();//获取总共有多少分钟int iSec=span.GetTotalSeconds();//获取总共有多少秒c,获得当前⽇期和时间,并可以转化为CStringCTime tm=CTime::GetCurrentTime();CString str=tm.Format("%Y-%m-%d");//显⽰年⽉⽇2.使⽤GetLocalTime:Windows API 函数,获取当地的当前系统⽇期和时间(精确到毫秒) 此函数会把获取的系统时间信息存储到SYSTEMTIME结构体⾥边typedef struct _SYSTEMTIME{WORD wYear;//年WORD wMonth;//⽉WORD wDayOfWeek;//星期:0为星期⽇,1为星期⼀,2为星期⼆……WORD wDay;//⽇WORD wHour;//时WORD wMinute;//分WORD wSecond;//秒WORD wMilliseconds;//毫秒}SYSTEMTIME,*PSYSTEMTIME;例:SYSTEMTIME st;CString strDate,strTime;GetLocalTime(&st);strDate.Format("%4d-%2d-%2d",st.wYear,st.wMonth,st.wDay);strTime.Format("%2d:%2d:%2d",st.wHour,st.wMinute,st.wSecond) ;AfxMessageBox(strDate);AfxMessageBox(strTime);3.使⽤GetTickCount:从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD。
Linux服务器编程之utime()函数修改文件存取时间
Linux服务器编程之utime()函数修改⽂件存取时间C语⾔utime()函数:修改⽂件的存取时间和更改时间头⽂件:#include <sys/types.h> #include <utime.h>定义函数:int utime(const char * filename, struct utimbuf * buf);函数说明:utime()⽤来修改参数filename ⽂件所属的inode 存取时间。
结构utimbuf 定义如下:struct utimbuf{time_t actime;time_t modtime;};返回值:如果参数buf 为空指针(NULL), 则该⽂件的存取时间和更改时间全部会设为⽬前时间.。
执⾏成功则返回0,失败返回-1,错误代码存于errno。
错误代码:1、EACCESS 存取⽂件时被拒绝, 权限不⾜。
2、ENOENT 指定的⽂件不存在。
C语⾔utimes()函数:修改⽂件的存取时间和更改时间头⽂件:#include <sys/types.h> #include <utime.h>定义函数:int utimes(char * filename, struct timeval *tvp);函数说明:utimes()⽤来修改参数filename ⽂件所属的inode 存取时间和修改时间。
结构timeval 定义如下:struct timeval{long tv_sec;long tv_usec; //微妙};返回值:参数 tvp 指向两个timeval 结构空间, 和utime ()使⽤的utimebuf 结构⽐较, tvp[0].tc_sec则为utimbuf.actime,tvp[1].tv_sec 为utimbuf.modtime. 执⾏成功则返回0. 失败返回-1, 错误代码存于errno.错误代码:1、EACCESS 存取⽂件时被拒绝, 权限不⾜。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最近突然有必要测试C语言中各个函数的运行时间,于是就搜索了一下,发现有4种方法可以达成测算程序运行时间的目的。
它们分别是使用clock, times, gettimeofday, getrusage来实现的。
下面就来逐一介绍,并比较它们的优劣点。
程序做的处理很简单,就是填写一个1024*1024的矩阵。
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#define TEST_BY_CLOCK (char)(0x00)
#define TEST_BY_TIMES (char)(0x01)
#define TEST_BY_GETTIMEOFDAY (char)(0x02)
#define TEST_BY_GETRUSAGE (char)(0x03)
#define TEST_METHOD (TEST_BY_GETTIMEOFDAY)
#define COORDINATION_X (int)(1024)
#define COORDINATION_Y (int)(1024)
static int g_Matrix[COORDINA TION_X][COORDINATION_Y];
double getTimeval()
{
struct rusage stRusage;
struct timeval stTimeval;
if (TEST_METHOD == TEST_BY_GETTIMEOFDAY) {
gettimeofday(&stTimeval, NULL);
} else if (TEST_METHOD == TEST_BY_GETRUSAGE) {
getrusage(RUSAGE_SELF, &stRusage);
stTimeval = stRusage.ru_utime;
}
return _sec + (double)_usec*1E-6;
}
int main()
{
int i, j;
int n = 0;
clock_t clockT1, clockT2;
double doubleT1, doubleT2;
if (TEST_METHOD == TEST_BY_CLOCK) {
clockT1 = clock();
} else if (TEST_METHOD == TEST_BY_TIMES) {
times(&clockT1);
} else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY) {
doubleT1 = getTimeval();
} else if (TEST_METHOD == TEST_BY_GETRUSAGE) {
doubleT1 = getTimeval();
}
****************************************************************************** for (i = 0; i < COORDINA TION_X; i++) {
for (j = 0; j < COORDINA TION_Y; j++) {
g_Matrix[i][j] = i * j;
}
}
****************************************************************************** if (TEST_METHOD == TEST_BY_CLOCK) {
clockT2 = clock();
printf("Time result tested by clock = %10.30f\n",
(double)(clockT2 - clockT1)/CLOCKS_PER_SEC);
} else if (TEST_METHOD == TEST_BY_TIMES) {
times(&clockT2);
printf("Time result tested by times = %10.30f\n",
(double)(clockT2 - clockT1)/sysconf(_SC_CLK_TCK));
} else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY) {
doubleT2 = getTimeval();
printf("Time result tested by gettimeofday = %10.30f\n",
(double)(doubleT2 - doubleT1));
} else if (TEST_METHOD == TEST_BY_GETRUSAGE) {
doubleT2 = getTimeval();
printf("Time result tested by getrusage = %10.70f\n",
(double)(doubleT2 - doubleT1));
}
return 0;
}
使用clock的方法:
clock是ANSI C的标准库函数,关于这个函数需要说明几点。
首先,它返回的是CPU耗费在本程序上的时间。
也就是说,途中sleep的话,由于CPU资源被释放,那段时间将不被计算在内。
其次,得到的返回值其实就是耗费在本程序上的CPU时间片的数量,也就是Clock Tick的值。
该值必须除以CLOCKS_PER_SEC这个宏值,才能最后得到ss.mmnn格式的运行时间。
在POSIX兼容系统中,CLOCKS_PER_SEC的值为1,000,000的,也就是1MHz。
最后,使用这个函数能达到的精度大约为10ms。
使用times的方法:
times的用法基本和clock类似,同样是取得CPU时间片的数量,所不同的是要除以的时间单位值为sysconf(_SC_CLK_TCK)。
使用gettimeofday的方法:
用gettimeofday直接提取硬件时钟进行运算,得到的结果的精度相比前两种方法提高了很多。
但是也正由于它提取硬件时钟的原因,这个方法只能计算程序开始时间和结束时间的差值。
而此时系统中如果在运行其他的后台程序,可能会影响到最终结果的值。
如果后台繁忙,系统dispatch过多的话,并不能完全真实反映被测量函数的运行时间。
使用getrusage的方法:
getrusage得到的是程序对系统资源的占用信息。
只要指定了RUSAGE_SELF,就可以得到程序本身运行所占用的系统时间。
可以说是精度最高的测量方法了。
自己试用了这四种方法,感觉需要高精度测试的话,getrusage和gettimeofday都可以选择。
需要长时间测试的话,clock也是不错的,尤其是考虑到它的通用性。