localtime 的性能问题及其替代者
在系统从redhat5升到redhat6的过程中,服务的性能差了很多。经过定位发现是程序中频繁调用localtime/localtime_r所致。
而调用localtime_r 的实现中,对时区进行了加锁,有bug反馈其有切换的性能损耗。
修复服务程序就有两种思路。
1. 减少localtime_r的调用。
2. 寻找localtime_r的替换者。
第一种思路比较简单,用一个变量调用一次,需要的时候就用该变量即可。
下面谈一下第二种思路。我们的系统调用localtime_r主要是为了获取tm结构中的有限几个域,如时分秒等。我们找到了
《进行日期时间转换和计算的几个Shell小函数》这样通过计算得到tm结构的方法,将其翻译为C++的程序FastSecondToDate,
对于其解释有一篇博文《一个精巧的日期差算法赏析》共参考。
在系统测试中,FastSecondToDate 基本上不耗时,性能有x200以上的提升。
附 FastSecondToDate的实现
static int FastSecondToDate(const time_t& unix_sec, struct tm* tm, int time_zone)
{
static const int kHoursInDay = ;
static const int kMinutesInHour = ;
static const int kDaysFromUnixTime = ;
static const int kDaysFromYear = ;
static const int kMagicUnkonwnFirst = ;
static const int kMagicUnkonwnSec = ;
tm->tm_sec = unix_sec % kMinutesInHour;
int i = (unix_sec/kMinutesInHour);
tm->tm_min = i % kMinutesInHour; //nn
i /= kMinutesInHour;
tm->tm_hour = (i + time_zone) % kHoursInDay; // hh
tm->tm_mday = (i + time_zone) / kHoursInDay;
int a = tm->tm_mday + kDaysFromUnixTime;
int b = (a* + )/kMagicUnkonwnFirst;
int c = (-b*kMagicUnkonwnFirst)/ + a;
int d =((c* + ) / kMagicUnkonwnSec);
int e = -d * kMagicUnkonwnSec;
e = e/ + c;
int m = (*e + )/kDaysFromYear;
tm->tm_mday = -(kDaysFromYear * m + )/ + e + ;
tm->tm_mon = (-m/)* + m + ;
tm->tm_year = b* + d - + (m/);
return ;
}
localtime 的性能问题及其替代者的更多相关文章
- 测试mktime和localtime_r性能及优化方法
// 测试mktime和localtime_r性能及优化方法 // // 编译方法:g++ -g -o x x.cpp或g++ -O2 -o x x.cpp,两种编译方式性能基本相同. // // 结 ...
- 不明显的多线程编程的具体Bugs
我们都知道,在编写多线程程序时,我们应该记住很多细节,比如锁,使用线程安全库等.这里有一个不太明显的bug的列表,特定于多线程程序.其中许多都没有在初学者的文档或教程中提到,但我认为每个使用线程的人最 ...
- SSH三大框架笔面试总结
Java工程师(程序员)面题 Struts,Spring,Hibernate三大框架 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Sess ...
- Hibernate框架(未完待续······)
作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编 ...
- <转>Hibernate的优、缺点(局限性)
本文原文链接:http://hi.baidu.com/ko22223/item/dd9f6900015adc036d904877 一.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象 ...
- Hibernate和JDBC、EJB比较
参考:http://m.blog.csdn.net/article/details?id=7228061 一.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App S ...
- [JavaEE] SSH框架笔记_S.S.H框架各自的优缺点
Struts的原理和优点.Struts工作原理MVC即Model-View-Controller的缩写,是一种常用的设计模式.MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化.M ...
- 详解SSH框架的原理和优点
Struts的原理和优点. Struts工作原理 MVC即Model-View-Controller的缩写,是一种常用的设计模式.MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让 ...
- Struts2,Spring,Hibernate优缺点
struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发. 优点: Struts跟Tomcat.Turbine等诸多Apache项目一样,是开源软件,这是它的 ...
随机推荐
- UI- 不易记知识点汇总
1.static: 所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量. 静态变量并不是说其就不能改变值,不能改变值的量叫常量. 其拥有的值是可变的 ,而且它 ...
- 敏捷开发之scrum模型
什么是敏捷开发? 敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法. 怎么理解呢?首先,我们要理解它不是一门技术,它是一种开发方法,也就是一种软件开发的流程,它 ...
- canvas 绘制环形进度条
结果: 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...
- Linux SSH的命令详解[转]
http://www.linuxidc.com/Linux/2008-02/11055.htm前一阵远程维护Linux服务器,使用的是SSH,传说中的secure shell. 登陆:ssh [hos ...
- (二)js选择结构
1.js的执行顺序. a) 一般按照书写的顺序来执行. b) 另外一种是通过判断然后执行下一项语句. 注:一般讲js语句写在body内容的最后来执行. 2.js的结构 a) 顺序结构 ...
- 【PS实例】轻松打造梦幻的照片
本系列教程将开始讲解PS的一些制作实例,通过实例的讲解同时介绍各种工具和面板机快捷键的使用,这样能够让大家更有兴趣学习,在学习的同时能够创造出自己喜欢的东西.本人使用的教程都是根据本人多次调试制作,仅 ...
- 深入理解vsto,开发word插件的利器
开发了vsto,客户那边也有一些反映插件安装失败或者加载不上的情况.于是我下定决定再理解下vsto的工作机制,如下图: 如上图所示,我把vsto的解决方案分为两部分,一部分是vsto Add-ins, ...
- [BZOJ5297][CQOI2018]社交网络
bzoj luogu sol 就是求以\(1\)为根的生成树的数量. 直接矩阵树定理. code #include<cstdio> #include<algorithm> #i ...
- matlab 与 modelsim 联调 cic抽取滤波器
注:本设计的参数为:D=2,R=5,N=3:时钟频率为50mhz,输入信号为有符号8位,根据公式bmax=bin+N*log(2,R*D):可以得到bmax=18: 1,cic抽取滤波器原理 网上资料 ...
- C#检测应用程序重复启动----函数检测(可以在多用户登录情况下检测)
上文是在网上找的检测程序重复运行的类,但是感觉不是很好用,而且还使用了API,似乎完全没有必要,于是晚上自己写了一个函数,经过测试,在多用户下仍然可以检测到程序的多次运行.当然,如果程序改了名字还是可 ...