C语言中常用计时方法总结
C语言中常用计时方法总结1. time()头文件time.h函数原型time_t time(time_t * timer)功能返回以格林尼治时间GMT为标准从1970年1月1日00:00:00到现在的此时此刻所经过的秒数。用time()函数结合其他函数如localtime、gmtime、asctime、ctime可以获得当前系统时间或是标准时间。用difftime函数可以计算两个time_t类型的时间的差值可以用于计时。用difftime(t2,t1)要比t2-t1更准确因为C标准中并没有规定time_t的单位一定是秒而difftime会根据机器进行转换更可靠。用法time_tstart,end;starttime(NULL);//or time(start);//…calculating…endtime(NULL);printf(time%d\n,difftime(end,start));总结C标准库中的函数可移植性最好性能也很稳定但精度太低只能精确到秒对于一般的事件计时还算够用而对运算时间的计时就明显不够用了。2. clock()头文件time.h函数原型clock_t clock(void);功能该函数返回值是硬件滴答数要换算成秒需要除以CLK_TCK或者 CLK_TCKCLOCKS_PER_SEC。比如在VC6.0下这两个量的值都是1000。用法clock_tstart,end;start clock();//…calculating…end clock();printf(time%f\n,(double)end-start)/CLK_TCK);总结可以精确到毫秒适合一般场合的使用。3. timeGetTime()WIN32API头文件Mmsystem.h 引用库 Winmm.lib函数原型DWORD timeGetTime(VOID);功能返回系统时间以毫秒为单位。系统时间是从系统启动到调用函数时所经过的毫秒数。注意这个值是32位的会在0到2^32之间循环约49.71天。用法DWORDstart,end;start timeGetTime();//…calculating…end timeGetTime();printf(time%d\n,end-start);总结该函数的时间精度是五毫秒或更大一些这取决于机器的性能。可用timeBeginPeriod和timeEndPeriod函数提高timeGetTime函数的精度。如果使用了连续调用timeGetTime函数一系列返回值的差异由timeBeginPeriod和timeEndPeriod决定。4. GetTickCount()WIN32API头文件windows.h函数原型DWORD WINAPI GetTickCount(void);功能返回自设备启动后的毫秒数不含系统暂停时间。用法DWORDstart,end;start GetTickCount();//…calculating…end GetTickCount();printf(time%d\n,end-start);总结精确到毫秒。对于一般的实时控制使用GetTickCount()函数就可以满足精度要求。5. QueryPerformanceCounter()、QueryPerformanceFrequency()WIN32API头文件windows.h函数原型BOOLQueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);BOOLQueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);功能前者获得的是CPU从开机以来执行的时钟周期数。后者用于获得你的机器一秒钟执行多少次就是你的时钟周期。补充LARGE_INTEGER既可以是一个8字节长的整型数也可以是两个4字节长的整型数的联合结构 其具体用法根据编译器是否支持64位而定typedefunion_LARGE_INTEGER {struct{ DWORD LowPart ; LONG HighPart; }; LONGLONG QuadPart ; }LARGE_INTEGER;用法在进行定时之前先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数利用两次获得的计数之差及时钟频率计算出事件经历的精确时间。LARGE_INTEGERnum; longlong start,end,freq;QueryPerformanceFrequency(num); freqnum.QuadPart; QueryPerformanceCounter(num); startnum.QuadPart;//…calculating…QueryPerformanceCounter(num);endnum.QuadPart;printf(time%d\n,(end-start)*1000/freq);总结这种方法的定时误差不超过1微秒精度与CPU等机器配置有关一般认为精度为透微秒级。在Windows平台下进行高精度计时的时候可以考虑这种方法。6. gettimeofday()Linux C函数。头文件sys/time.h函数原型int gettimeofday(struct timeval *tv,struct timezone *tz);说明其参数tv是保存获取时间结果的结构体参数tz用于保存时区结果若不使用则传入NULL即可。timeval的定义为[cpp] view plain copy print?structtimeval {longtv_sec;// 秒数longtv_usec;//微秒数}可见该函数可用于在linux中获得微秒精度的时间。用法struct timevalstart,end;gettimeofday(start,NULL);//…calculating… gettimeofday(end,NULL);long timeuse 1000000 * (end.tv_sec -start.tv_sec ) end.tv_usec -start.tv_usec;printf(time%f\n,timeuse /1000000.0);总结使用这种方式计时精度可达微秒。经验证在armlinux的环境下此函数仍可使用。推荐。7. RDTSC - 读取时间标签计数器X86架构CPU汇编指令。操作码0F 31 指令RDTSC功能将时间标签计数器读入 EDX:EAX寄存器中。说明在Pentium以上的CPU中提供了一条机器指令RDTSC来读取这个时间戳的数字并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C语言保存函数返回值的寄存器所以我们可以把这条指令看成是一个普通的函数调用inlineunsignedlonglongGetCycleCount() { __asmRDTSC }如果编译器不允许直接用RDTSC的话可以用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31inlineunsignedlonglongGetCycleCount() { __asm_emit0x0F__asm_emit0x31}计算时还需要将得到的数字除以CPU的主频单位GHZ就能得到纳秒级的时间了。暂时我还没找到好的获得机器主频的方法Windows平台下可以考虑用QueryPerformanceFrequency()函数但这样一来就没办法在Linux下使用此方法。后来我考虑配合sleep函数获取1秒中的机器周期数的方法来得到CPU主频。如果哪位有更好的方法还请多多请教。#ifdef WIN32#include#else#include#endifinline unsigned long long GetNTime() { __asm(RDTSC); } static double hz0.0; void init_timer() { longlong t1GetNTime();#ifdef WIN32Sleep(1000);#elsesleep(1);#endiflonglong tGetNTime()-t1; hz(double)t/1000000000;printf(hz%fGhz\n,hz); } long long u_timer(long long*t,intmode) {if(hz0.001) init_timer();if(!mode) {*tGetNTime();return0; } longlong t1GetNTime()-*t; t1/hz; longlong nst100; longlong us(t1/1000)00; longlong ms(t1/1000000)00; longlongst1/1000000000;printf(time);if(s!0)printf(%llds,s);if(ms!0)printf(%lldms,ms);if(us!0)printf(%lldus,us);if(ns!0)printf(%lldns,ns);printf(\n);*tGetNTime(); returnt1; }总结这种方法精确到纳秒但缺点是非常短时间的计时会不稳定。最近因为项目需要我也找了一下ARMLinux平台上可以用的计时方法后来选择了gettimeofday()。不知道ARMLinux平台上有没有类似RDTSC的这种指令。

相关新闻

Mike工具源码解析:核心组件与实现原理

Mike工具源码解析:核心组件与实现原理

Mike工具源码解析:核心组件与实现原理 【免费下载链接】mike Manage multiple versions of your MkDocs-powered documentation via Git 项目地址: https://gitcode.com/gh_mirrors/mi/mike Mike是一款通过Git管理MkDocs文档多版本的强大工具,能够…

2026/7/28 2:22:32 阅读更多 →
开发者必看:ModularAvatar API深度解析与扩展开发

开发者必看:ModularAvatar API深度解析与扩展开发

开发者必看:ModularAvatar API深度解析与扩展开发 【免费下载链接】modular-avatar 项目地址: https://gitcode.com/gh_mirrors/mo/modular-avatar ModularAvatar是一款功能强大的开源工具,为VRChat avatar开发者提供了模块化的组件系统和灵活的…

2026/7/28 2:22:32 阅读更多 →
开源大模型技术对比:LLaMA、Qwen与DeepSeek

开源大模型技术对比:LLaMA、Qwen与DeepSeek

1. 开源大模型技术格局概述2023年以来的开源大模型领域呈现出爆发式增长态势,LLaMA 2/3、Qwen和DeepSeek三大系列模型凭借各自的技术特色形成了三足鼎立的局面。作为长期跟踪AI技术发展的从业者,我观察到这三个项目在模型架构、训练策略和应用场景上展现…

2026/7/28 2:22:32 阅读更多 →

最新新闻

C4D R26-R27全版本AI渲染兼容方案,含3套已验证Prompt工程模板(含中文语义映射表),失效即退

C4D R26-R27全版本AI渲染兼容方案,含3套已验证Prompt工程模板(含中文语义映射表),失效即退

更多请点击: https://kaifayun.com 第一章:C4D R26-R27全版本AI渲染兼容方案概览 Cinema 4D R26 与 R27 原生不支持 AI 加速渲染器(如 NVIDIA Omniverse Kit、Redshift 3.5 的 TensorRT 模式、或第三方插件集成的 Stable Diffusion 节点&…

2026/7/28 2:40:38 阅读更多 →
SQL Service超宽表解决方案:支持百万列与数十亿行数据处理

SQL Service超宽表解决方案:支持百万列与数十亿行数据处理

当你面对一个需要处理数十亿行数据或百万列宽表的场景时,传统数据库往往显得力不从心。无论是 MySQL 还是 PostgreSQL,在超宽表或海量数据下的查询性能都会急剧下降,甚至直接报错。今天要介绍的 SQL Service,正是为解决这一痛点而…

2026/7/28 2:40:38 阅读更多 →
乐高EV3播放视频:Python图像处理与PBM格式的嵌入式应用

乐高EV3播放视频:Python图像处理与PBM格式的嵌入式应用

1. 项目概述:当乐高EV3遇上“极乐净土”如果你手边有一台乐高EV3机器人,又恰好对编程和创意项目感兴趣,那么你很可能想过让它干点“出格”的事,比如,播放一段视频。这个想法听起来有点天马行空,毕竟EV3那块…

2026/7/28 2:40:38 阅读更多 →
Unity UGUI无限滚动列表:高性能数据展示与性能优化实战

Unity UGUI无限滚动列表:高性能数据展示与性能优化实战

1. 项目概述:为什么我们需要无限滚动列表?在Unity的UGUI开发中,列表(List)是展示数据最常用的组件之一。无论是背包系统、排行榜、聊天记录,还是商品展示,都离不开它。然而,当数据量…

2026/7/28 2:40:38 阅读更多 →
MaixPy软I2C移植实战:解决K210引脚冲突,驱动任意GPIO的I2C传感器

MaixPy软I2C移植实战:解决K210引脚冲突,驱动任意GPIO的I2C传感器

1. 项目概述:为什么要在 MaixPy 上折腾软 I2C?如果你玩过基于 K210 芯片的 MaixPy 开发板,比如 Maix Dock 或者 Maixduino,大概率用过它内置的硬件 I2C。硬件 I2C 用起来确实方便,引脚固定,速度也快。但问题…

2026/7/28 2:40:38 阅读更多 →
如何用YOLOv5实现12种中文车牌检测识别:从零开始的完整指南

如何用YOLOv5实现12种中文车牌检测识别:从零开始的完整指南

如何用YOLOv5实现12种中文车牌检测识别:从零开始的完整指南 【免费下载链接】Chinese_license_plate_detection_recognition yolov5 车牌检测 车牌识别 中文车牌识别 检测 支持12种中文车牌 支持双层车牌 项目地址: https://gitcode.com/GitHub_Trending/ch/Chine…

2026/7/28 2:39:38 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻