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项目一样,是开源软件,这是它的 ...
随机推荐
- ViewGroup的事件分发机制
我们用手指去触摸Android手机屏幕,就会产生一个触摸事件,但是这个触摸事件在底层是怎么分发的呢?这个我还真不知道,这里涉及到操作硬件 (手机屏幕)方面的知识,也就是Linux内核方面的知识,我也没 ...
- Nodejs-cli 填坑记
真的是玩玩没想到,一个cli竟然坑了我这么久,想当年写Python命令行工具的时候,哪有这么麻烦?随随便便写几下,添加个批处理命令脚本就搞定了.怎么Nodejs写一个就这么不顺利呢? 吐槽归吐槽,当我 ...
- InnoSetup使用笔记
今天用InnoSetup做安装包时,因为要装的驱动区分32位.64位,64位系统中要安装32位+64位驱动. 想在脚本中进行判断.折腾一阵,终于搞定: 参考了:http://379910987.blo ...
- 深入理解java虚拟机-第二章
第2章 Java内存区域与内存溢出异常 运行数据区域 1.程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 2.J ...
- bzoj 5369 最大前缀和
Written with StackEdit. Description 小\(C\)是一个算法竞赛爱好者,有一天小\(C\)遇到了一个非常难的问题:求一个序列的最大子段和. 但是小\(C\)并不会做这 ...
- 接口测试基础——第5篇xlrd模块
读取Excel表格中的内容,不多说,直接上代码: # coding: utf-8 import xlrd # excel路径 excel_path = r'C:\Users\weiming\Deskt ...
- avalon 总线时序关系理解
对于读,等待时间指的是从端口捕获数据的时间相对于read信号的延时 建立时间指的是read信号相对于chipselect和addr的延时时间 对于写,等待时间指的是相对于非等待情况下各个信号的延时时间 ...
- java多线程:synchronized和lock比较浅析
转载:http://www.toutiao.com/a6392135944652587266/?tt_from=weixin&utm_campaign=client_share&app ...
- dubbox部署到jdk1.7环境,启动:java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()
本地用jdk1.8编译的服务提供端war包,部署到环境报错了: INFO: Initializing Spring root WebApplicationContext [16/08/17 05:14 ...
- Shell脚本基础知识详细介绍(一)
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种 ...