mktime函数优化方案

#include <time.h>
#include <stdio.h>
#include <sys/time.h>
void printnow(){
    static unsigned long long time=0;
    timeval tm; 
    gettimeofday(&tm,NULL);
    if(time !=0)        
    printf("cost time = %llu\n",tm.tv_sec*1000000+tm.tv_usec - time);
    time = tm.tv_sec*1000000+tm.tv_usec;
}


time_t GetTime(int year, int month, int day, int hour, int minute, int second)
{
    tm stTM;
    stTM.tm_sec = second;
    stTM.tm_min = minute;
    stTM.tm_hour = hour;
    stTM.tm_mday = day;
    stTM.tm_mon = month - 1;
    stTM.tm_year = year - 1900;


    return mktime(&stTM);
}
time_t GetTime_2(int year, int month, int day = 1, int hour = 0, int minute = 0, int second = 0)
{
    static __thread int iyear=0;
    static __thread int imonth=0;
//    static __thread int iday=0;
    static __thread unsigned long long time=0;
    if(year!=iyear||imonth!=month){//{||iday!=day){
        tm stTM;
        stTM.tm_sec = 0;//second;
        stTM.tm_min = 0;//minute;
        stTM.tm_hour = 0;//hour;
        stTM.tm_mday = 1;//day;
        stTM.tm_mon = month - 1;
        stTM.tm_year = year - 1900;
        time = mktime(&stTM);
        iyear = year;
        imonth = month;
  //      iday = day;
    }   
    return time+((((day - 1)*24+hour)*60+minute)*60)+second;
}


int main()
{
  int count = 10000;
    time_t m_tNow ;
    time_t time1,time2;
    m_tNow = time(0);
    tm stTM;
    localtime_r ( &m_tNow, &stTM );


    printf("loop count:%d\n",count);
    printnow();


    for(int i = 0;i<count;i++){
        time1 = GetTime(stTM.tm_year + 1900,stTM.tm_mon + 1,stTM.tm_mday,stTM.tm_hour,stTM.tm_min,stTM.tm_sec);
    }
    printnow();
    for(int i =0;i<count;i++){
        time2 = GetTime_2(stTM.tm_year + 1900,stTM.tm_mon + 1,stTM.tm_mday,stTM.tm_hour,stTM.tm_min,stTM.tm_sec);
    }
    printnow();
    printf("GetTime() result:%lu\n",time1);
    printf("GetTime_2() result:%lu\n",time2);

 
  return 0;

}


运行结果

loop count:10000
cost time = 25699
cost time = 115

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值