在系统从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 的性能问题及其替代者的更多相关文章

  1. 测试mktime和localtime_r性能及优化方法

    // 测试mktime和localtime_r性能及优化方法 // // 编译方法:g++ -g -o x x.cpp或g++ -O2 -o x x.cpp,两种编译方式性能基本相同. // // 结 ...

  2. 不明显的多线程编程的具体Bugs

    我们都知道,在编写多线程程序时,我们应该记住很多细节,比如锁,使用线程安全库等.这里有一个不太明显的bug的列表,特定于多线程程序.其中许多都没有在初学者的文档或教程中提到,但我认为每个使用线程的人最 ...

  3. SSH三大框架笔面试总结

    Java工程师(程序员)面题 Struts,Spring,Hibernate三大框架 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Sess ...

  4. Hibernate框架(未完待续······)

        作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编 ...

  5. <转>Hibernate的优、缺点(局限性)

    本文原文链接:http://hi.baidu.com/ko22223/item/dd9f6900015adc036d904877 一.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象 ...

  6. Hibernate和JDBC、EJB比较

    参考:http://m.blog.csdn.net/article/details?id=7228061 一.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App S ...

  7. [JavaEE] SSH框架笔记_S.S.H框架各自的优缺点

    Struts的原理和优点.Struts工作原理MVC即Model-View-Controller的缩写,是一种常用的设计模式.MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化.M ...

  8. 详解SSH框架的原理和优点

    Struts的原理和优点.        Struts工作原理  MVC即Model-View-Controller的缩写,是一种常用的设计模式.MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让 ...

  9. Struts2,Spring,Hibernate优缺点

    struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发. 优点: Struts跟Tomcat.Turbine等诸多Apache项目一样,是开源软件,这是它的 ...

随机推荐

  1. 用 hash 找出指定一个数, 这个数是数组两个值的总和, 找出两个值的坐标

    var twoSum = function(nums, target) { var len = nums.length; var exist = {} //这里利用了hash来存放已知的 exist[ ...

  2. windows获取屏幕显示比例 读取注册表法

    static int GetDesktopScale() { ; HINSTANCE hUser32 = LoadLibrary(L"user32.dll"); if (hUser ...

  3. php语法笔记

    1.  php中设置页面的编码方式: header(“content-type:text/html;charset=utf-8”); 2.  数据类型 布尔类型:Boolean/bool:true.f ...

  4. 前端之JavaScript 04 事件 (未全)

    一.事件类型 常见的主要事件类型介绍如下: onfocus 元素获得焦点. 练习:输入框 onblur 元素失去焦点. 应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行 ...

  5. (九)jsMath

    1.Math对象 作用:用于执行数学任务,把Math作为对象就可以调用其方法和属性. eg:    typeof Math); 2.Math属性     PI:圆周率(约等于 3.1415926); ...

  6. Python Requests快速入门

    迫不及待了吗?本页内容为如何入门Requests提供了很好的指引.其假设你已经安装了Requests.如果还没有, 去 安装 一节看看吧. 首先,确认一下: Requests 已安装 Requests ...

  7. ACM学习历程—51NOD 1412 AVL树的种类(递推)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1770 这是这次BSG白山极客挑战赛的B题.设p(i, j)表示节点个数为 ...

  8. vue指令总结

    new  Vue({          el: "#box",            // element(元素) 当前作用域          data:{ msg:" ...

  9. Excel 2007 打开 UTF-8 编码 CSV 文件的乱码BUG

    http://blog.sina.com.cn/s/blog_6c3b65fd01018dgq.html 打开UTF-8编码的CSV方法: 1) 打开Excel 2007 2) 执行“数据”-> ...

  10. leetcode 21.Merge Two Sorted Lists ,java

    题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...