在做测试或性能优化时,经常要知道程序运行的时间,在Linux系统可以使用time命令来计算程序运行运行所消耗的时间,能精确到毫秒,如果要精确到代码块或某个操作运行时所消耗的时间,time命令就不给力了。如果对时间的精度要求不高的话,可以调用标准C的接口time来得到开始和结束的时间,再调用difftime接口来计算时间差,精度是秒,代码如下所示:

#include <stdio.h>
#include <time.h>int main(){time_t t_start, t_end; t_start = time(NULL) ;sleep(3000);t_end = time(NULL) ;printf("time: %.0f s\n", difftime(t_end,t_start)) ;return 0;
}

如果要让程序休眠3秒,Windows使用Sleep(3000),Linux使用sleep(3),即Windows的Sleep接口的参数的单位是毫秒,Linux的sleep接口的参数的单位是秒。

如果需要精确到毫秒,以上程序就发挥不了作用,如果在Java要达到这要求就很简单了,代码如下所示:

public class Time {public static void main(String[] args) {try {long startTime = System.currentTimeMillis();Thread.sleep(3000);long endTime = System.currentTimeMillis();System.out.println("time: " + (endTime - startTime) + " ms");} catch (InterruptedException e) {e.printStackTrace();}}
}

通过Google找了一些资料后,发现C语言里没有标准的接口可以获得精确到毫秒的时间,都会调用到与操作系统相关的API,下面会分别介绍在Linux和Windows系统下的多种实现方法,希望对大家有帮助。

Linux系统

使用gettimeofday接口:

#include <stdio.h>
#include <sys/time.h>int main() {struct timeval start, end;gettimeofday( &start, NULL );sleep(3); gettimeofday( &end, NULL );int timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec; printf("time: %d us\n", timeuse);return 0;
}

gettimeofday能得到微秒数,比毫秒还要更精确。

使用ftime接口:

#include <stdio.h>
#include <sys/timeb.h>long long getSystemTime() {struct timeb t;ftime(&t);return 1000 * t.time + t.millitm;
}int main() {long long start=getSystemTime();sleep(3);long long end=getSystemTime();printf("time: %lld ms\n", end-start);return 0;
}

Windows系统

使用GetTickCount接口:

#include <windows.h>
#include <stdio.h>int main() {DWORD start, stop; start = GetTickCount();Sleep(3000);stop = GetTickCount();printf("time: %lld ms\n", stop - start);return 0;
}

Windows系统下有些编译器使用printf输出64位整数参数要使用%I64d,比如VC。

使用QueryPerformanceX接口:

#include <windows.h>
#include <stdio.h>int main(){LARGE_INTEGER li;LONGLONG start, end, freq;QueryPerformanceFrequency(&li);freq = li.QuadPart;QueryPerformanceCounter(&li);start = li.QuadPart;Sleep(3000);QueryPerformanceCounter(&li);end = li.QuadPart;int useTime =(int)((end - start) * 1000 / freq);printf("time: %d ms\n", useTime);return 0;
}

使用GetSystemTime接口:

#include <windows.h>
#include <stdio.h>int main(){SYSTEMTIME currentTime;GetSystemTime(&currentTime);printf("time: %u/%u/%u %u:%u:%u:%u %d\n",            currentTime.wYear,currentTime.wMonth,currentTime.wDay,currentTime.wHour,currentTime.wMinute,currentTime.wSecond,currentTime.wMilliseconds,currentTime.wDayOfWeek);return 0;
}

这种方法没给出计算时间差的实现,只给出如何用GetSystemTime调用得到当前时间,计算时间差比较简单,根据年、月、日、时、分秒和毫秒计算出一个整数,再将两整数相减即可。

后记

以上是通过Google找到一些用C语言获得精确到毫秒的实现方法,对比Linux和Windows的方法,发现两个系统的API命名很不一样,Linux接口名要么都是小写要么使用下划线(_)来分隔单词,而Windows接口名中的单词首字母大写。

C语言如何获得精确到毫秒的时间相关推荐

  1. java 怎么用毫秒_java1.8中如何使用精确到毫秒的时间

    SimpleDateFormat,用于显示时间的格式. Date,获取精确到毫秒的时间. Calendar,获取日历格式的时间. 示例代码如下: package baseAPI; import jav ...

  2. mysql精确到毫秒_mysql 时间类型精确到毫秒、微秒及其处理

    一.MySQL 获得毫秒.微秒及对毫秒.微秒的处理 MySQL 较新的版本中(MySQL 6.0.5),也还没有产生微秒的函数,now() 只能精确到秒. MySQL 中也没有存储带有毫秒.微秒的日期 ...

  3. Java精确到毫秒获取时间的三种方法,以及适用场景

    目前获取毫秒值时间戳大概有下面三种方法 // 方法一 System.currentTimeMillis(); // 方法二 Calendar.getInstance().getTimeInMillis ...

  4. oracle当前毫秒时间,oracle获得当前时间,精确到毫秒并指定精确位数

    oracle获得当前时间的,精确到毫秒   可以指定精确豪秒的位数 select to_char(systimestamp, 'yyyymmdd hh24:mi:ss.ff ') from dual; ...

  5. Excel使用之时间相加减(精确到毫秒)

    一.工具: 使用Excel2013 二.操作步骤: 可以对精确到毫秒的时间相减统计2个数据相差或相加计算数据之和,具体操作如下: 1.时间相减,统计2个时间点之差 (1)首先保证需要相加减时间个数一一 ...

  6. c linux time微秒_qt linux系统获取当前时间(精确到毫秒、微秒)-Go语言中文社区...

    qt linux系统获取当前时间(精确到毫秒.微秒) Windows系统获取系统时间可以直接用SYSTEMTIME t;,将Windows平台程序移植到linux后,SYSTEMTIME将不再试用,如 ...

  7. android 获取当前时间精确到毫秒的两种方法

    1.概述 在android app开发中,在项目中有些功能需求要求要获取当前时间精确到毫秒,已便于完成功能开发的需要,而在android 的系统api中提供了SimpleDateFormat和Cale ...

  8. java calendar 毫秒_java Calendar(将时间精确到毫秒)

    package com.neusoft.date; import java.util.Calendar; import java.util.Date; import java.util.Gregori ...

  9. timestamp显示毫秒_mysql解决datetime与timestamp精确到毫秒的问题

    CREATE TABLE `tab1` ( `tab1_id` VARCHAR(11) DEFAULT NULL, `create` TIMESTAMP(3) NULL DEFAULT NULL, ` ...

最新文章

  1. Spring中Quartz的配置
  2. mysql 执行计划大于_Mysql执行计划(大章)
  3. jsoncpp在vs2013上的编译
  4. 【PP物料】物料主档备忘录
  5. JavaFX——fxml文件加载错误:[javafx.fxml.LoadException]解决方案之一
  6. Scalaz(27)- Inference Unapply :类型的推导和匹配
  7. C# HSSFWorkbook与XSSFWorkbook的区别和.xls和.xlsx的区别
  8. why my custom callback is not called
  9. APP技巧:微信10个实用小技巧,太实用了,赶紧收藏!
  10. Zabbix安装图解教程
  11. android APP优化知识图谱
  12. 电脑复制手机粘贴,这些Mac的隐藏玩法你知道吗?
  13. LBS (基于位置服务)-- Location Based Service
  14. 思科交换机配置命令大全
  15. 汽车故障检测仪计算机教程,道通MS诊断仪在线编程刷隐藏908SPRO汽车故障检测电脑...
  16. Visio画拓扑图随记
  17. 关于saas模式开发
  18. 普通PC键盘和苹果键盘比较图
  19. 小猫爪:i.MX RT1050学习笔记3-CCM
  20. pci 中断冲突_PCI设备中断冲突的基本解决办法

热门文章

  1. 轻巧的批量图片压缩工具imgfast
  2. opencv for python (6) 改变一幅图的特定区域 (往一幅图片上加标志)
  3. 12-1 蓝色天空 : 创建一个背景为蓝色的Pygame窗口 12-2 游戏角色 : 找一幅你喜欢的游戏角色位图图像或将一幅图像转换为位图。 创建一个类, 将该角色绘制到屏幕中央, 并将该图像的背景色
  4. 常用电平标准(TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232
  5. 常用手机uc浏览器兼容问题记录(陆续补充)
  6. linux服务器实训心得体会,linux实训心得体会
  7. [OPNET]license expired的处理
  8. Failed connect to github-production-release-asset-2e65be.s3.amazonaws.com:443; 连接超时
  9. 【html】屏蔽浏览器自带的输入提示
  10. 详解多站点应用CSMA/CA原理进行无线传输的过程