localtime_r优化方案

#include <iostream>
#include <sys/time.h>
#include <string.h>
using namespace std;


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;
}


void printtm(tm& tm){
    printf("tm_sec:%d,tm_min:%d,tm_hour:%d,tm_day:%d,tm_mon:%d,tm_year:%d,tm_wday:%d,tm_yday:%d,tm_isdst:%d,tm_gmtoff:%d,tm_zone:%s\n",
            tm.tm_sec,tm.tm_min,tm.tm_hour,tm.tm_mday,tm.tm_mon,tm.tm_year,tm.tm_wday,tm.tm_yday,tm.tm_isdst,tm.tm_gmtoff,tm.tm_zone);
}




tm* my_localtime_r(const time_t* tNow,tm* stTM){


    static __thread long t_start = 0;
    static __thread tm tm_start;
#define my_localtime_r_t_oneday 86400                //(24*60*60)
#define my_localtime_r_t_onehour 3600                //(60*60)


    if(t_start == 0||*tNow<t_start||*tNow-t_start>=my_localtime_r_t_oneday){
        localtime_r(tNow,&tm_start);
        tm_start.tm_hour = 0;
        tm_start.tm_min = 0;
        tm_start.tm_sec = 0;
        t_start=mktime(&tm_start);
    }   
#define my_localtime_r_off  (*tNow-t_start)
    tm_start.tm_hour = (*tNow-t_start)/(my_localtime_r_t_onehour);
    tm_start.tm_min = ((*tNow-t_start)-my_localtime_r_t_onehour*tm_start.tm_hour)/60;
    tm_start.tm_sec = ((*tNow-t_start)-my_localtime_r_t_onehour*tm_start.tm_hour-60*tm_start.tm_min);
    memcpy(stTM,&tm_start,sizeof(tm));
    return stTM;
}


int main(int argc, char * argv[])
{
time_t m_tNow;
    tm m_stTM;
    tm m_stTM1;


    tm* result;
    tm* result1;


    m_tNow = time(0);


    int count = 100000;


    printnow();


    for(int i=0;i<count;i++){
        result = localtime_r (&m_tNow, &m_stTM);
    }
    printnow();


    for(int i =0;i<count;i++)
    {
        result1 = my_localtime_r( &m_tNow, &m_stTM1);
    }
    printnow();


    printtm(*result);
    printtm(*result1);

}


优化效果

cost time = 57066 //原生localtime_r
cost time = 2003 //优化后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值