#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);
#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 //优化后