(转)windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTime

执行 10000000 次, 耗时 2258,369 微秒     QueryPerformanceCounter

执行 10000000 次, 耗时 26,347 微秒    GetTickCount

执行 10000000 次, 耗时 242,879 微秒     time()

c的时间函数 time(time_t) 大概比GetSystemTimeAsFileTime慢6倍,比_ftime 快6倍

执行 10000000 次, 耗时 1310,066 微秒   _ftime

执行 10000000 次, 耗时 1722,125 微秒  GetLocalTime

执行 10000000 次, 耗时 39,131 微秒  GetSystemTimeAsFileTime

GetLocalTime耗时等于  = GetSystemTimeAsFileTime 耗时+  FileTimeToSystemTime 的耗时

------------

可以看到精度越高性能越差

GetTickCount  精度1毫秒  >  GetLocalTime  精度100纳秒 (0.1 微秒)  >  QueryPerformanceCounter  (搞不懂这个怎么这么差)

如果仅仅为了计算时间偏差,可以使用 GetSystemTimeAsFileTime,这个精度可以达到100纳秒,

msdn有个介绍。

http://msdn.microsoft.com/ZH-CN/library/windows/desktop/ms724284(v=vs.85).aspx

Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).

It is not recommended that you add and subtract values from the FILETIME structure to obtain relative times. Instead, you should copy the low- and high-order parts of the file time to a ULARGE_INTEGER structure, perform 64-bit arithmetic on the QuadPart member, and copy the LowPart and HighPart members into the FILETIME structure.

Do not cast a pointer to a FILETIME structure to either a ULARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows.

测试代码如下

#include <iomanip>

#include <fstream>

#include <iostream>

#include <map>

#include <sstream>

#include <list>

#include <vector>

 

 

#include <stdlib.h>

#include <stdint.h>

#include <stdio.h>

#include <sys/types.h>

#include <sys/timeb.h>

#include <time.h>

#include <Windows.h>

 

 

#include "Trace.h"

 

using namespace std;

 

 

 

 int main (intchar**)

{

  

 LARGE_INTEGER freq, t0, t1;

 QueryPerformanceFrequency(&freq);

 size_t number = 10000000;

    

  

  

 int total_counter = 0;

 //LARGE_INTEGER t3;

   

 //struct timeb timebuffer;

 SYSTEMTIME lt; 

 FILETIME SystemTimeAsFileTime;

  

 QueryPerformanceCounter(&t0);

 for (int i=0; i< number; i++) {

    //QueryPerformanceCounter(&t3);

    //total_counter  += t3.LowPart;

     //total_counter += GetTickCount();

 

     //ftime(&timebuffer);

     //total_counter += timebuffer.time;

  

    //GetLocalTime(&lt); 

    //total_counter += lt.wMilliseconds;

    

    // total_counter += _time32(NULL);   time(NULL)

  

     GetSystemTimeAsFileTime(&SystemTimeAsFileTime);

     FileTimeToSystemTime(&SystemTimeAsFileTime,&lt);

     total_counter += lt.wMilliseconds;

 }

 QueryPerformanceCounter(&t1);

  

 int time = (((t1.QuadPart-t0.QuadPart)*1000000)/freq.QuadPart);

 std::cout  << "执行 " << number <<" 次, 耗时 " << time <<  " 微秒" << std::endl;

   

 std::cout << total_counter;

 int a;

 cin >> a;

 return 0;

}

转自:http://gmd20.blog.163.com/blog/static/168439232012113111759514/

时间: 2024-08-13 17:38:00

(转)windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTime的相关文章

linux 时间函数

linux 时间函数: time/time_t  秒 ftime/ struct timeb 毫秒 gettimeofday/struct timeval us clock_gettime/ struct timespec ns gmtime/localtime/timegm/mktime/strftime/struct tm 其中 time 精度低, ftime 已废弃, clock_gettime 系统调用,精度高 gettimeofday  vsyscall ,系统态, 开销低 定时函数,

windows平台中让函数在main函数之前执行的方法

1.将要执行的代码写到类的构造函数中,并定义对应的全局变量2.将要执行的代码写到TLS回调函数中在c/c++中,我们都知道main函数是程序开始执行的地方,但是在进行反调试的时候,很多时候都需要调试检测函数在main函数之前执行. 1.将要执行的代码写到类的构造函数中,并定义对应的全局变量在windows平台中,执行我们手写的main函数之前,系统会执行一段CRTstartup代码,对系统的堆栈.全局变量.命令行参数.环境变量等进行初始化操作.该方法就是利用windows在执行main函数之前先

Windows 各种计时函数总结

本文对Windows平台下常用的计时函数进行总结,包括精度为秒.毫秒.微秒三种精度的 5种方法.分为在标准C/C++下的二种time()及clock(),标准C/C++所以使用的time()及clock()不仅可以用在 Windows系统,也可以用于Linux系统.在Windows系统下三种,使用Windows提供的API接口timeGetTime(). GetTickCount()及QueryPerformanceCounter()来完成.文章最后给出了5种计时方法示例代码. 标准C/C++的

深入探究Windows平台客户端安全问题-进程地址空间入侵和白加黑高阶利用

标 题: 深入探究Windows平台客户端安全问题-进程地址空间入侵和白加黑高阶利用 时 间: 2014-09-08,00:03:51 前言 为了避免被读者骂"标题党",笔者在文章开头先澄清一下这个高大尚的"进程地址空间入侵"的可替代词语-注入. 看完第一句还能看到这里的读者一般有两种:1.初学者,实在是不懂所以需要学习的同学 2.大牛,只是想看看笔者打算怎么来炒"注入"这盘冷饭. 好吧,如很多人都知道的一样,Windows平台下的远程模块&qu

Windows平台分布式架构实践 - 负载均衡

概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过 Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为什么那么的迫切的希望.NET跨平台呢?第一个理由是便宜,淘宝号称4万多台服务器 全部运行在Linux,Linux平台下还有免费的MySql,这些都是免费的,这些省下来直接就是利润呀,做企业的成本可以降低又没有任何损失,何乐而 不为呢?第二个理由是在Linux系统下还有很多非常优秀的构架(当然同样也

基于科大讯飞语音云windows平台开发

前记: 前段时间公司没事干,突发奇想想做一个语音识别系统,看起来应该很简单的,但做起来却是各种问题,这个对电气毕业的我,却是挺为难的.谷姐已经离我们而去,感谢度娘,感谢CSDN各位大神,好歹也做的是那么回事了,虽然还是不好用,但基本功能实现了. 该软件使用VS2008C++/CLR开发,由于科大讯飞提供的是C的API接口,结果到这边就是各种不兼容,CLR是基于托管堆运行的,而这个API有是非托管堆的,使用了各种指针,原本打算使用C#来做,最后门外汉的我也没能做到C#和C指针完美结合,真怀恋单片机

Windows中openProcess函数返回ERROR_ACCESS_DENIED的解决方法

辛辛苦苦开始了创业,好不容易见到了天使投资人,如何去打动明星投资人?如何能拿到那一笔"救命"钱?看徐小平.雷军这样说. 1. 天使投资人偏爱投什么样的创业者? 雷军:你有强烈的渴望做成一件伟大的事情,并且能让投资者相信你能做得成这件事情.掏自己的钱创业是创业成功率最高的一种,因为在那一瞬间你重视了,你花的每一分钱都是自己的血汗钱和别人的血汗钱,不会轻松把别的投资人的钱打水漂. 曾李青:我们体系内投了好几家公司,发现我们投资成功的公司要么是有做大公司的成功经验,要么是名校毕业.好学校不一

C++中的时间函数

C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确的时间,使用两个函数 BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency); BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount); 这两个函数分别是获取CPU的时钟频率和CPU计数器

Windows平台分布式架构实践 - 负载均衡 上

概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为什么那么的迫切的希望.NET跨平台呢?第一个理由是便宜,淘宝号称4万多台服务器全部运行在Linux,Linux平台下还有免费的MySql,这些都是免费的,这些省下来直接就是利润呀,做企业的成本可以降低又没有任何损失,何乐而不为呢?第二个理由是在Linux系统下还有很多非常优秀的构架(当然同样也是免费