锁定老帖子 主题:为了优化性能,请看看我这段代码应该如何抉择
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-10-20
以下是代码段: package com.ocs.common.util; import java.util.Date; import java.util.Calendar; /** * 日期处理组件,用于处理日期中的时、分、秒、毫秒,使日期处于当日的最开始时刻或最后时刻 * @author Johnny 2006-06-19 * */ public class DateProcessor { private static final long MAX_MILLISECONDS = 3600*24*1000 - 1; // 每日的最大毫秒数 private static Calendar _tempCal = Calendar.getInstance(); // 用于线程安全的方法,避免频繁创建对象 /** * 工具类,不能被实例化 * */ private DateProcessor() { } /** * 获得日期对象的最开始时间,即当日的00:00:00.000,返回Date是一个新对象,不影响传入对象 * @param startDate * @return */ public static Date dateStart(Date startDate) { if(startDate==null) return null; Calendar tempCal = Calendar.getInstance(); tempCal.setTime(startDate); tempCal.set(Calendar.HOUR_OF_DAY,0); tempCal.set(Calendar.MINUTE,0); tempCal.set(Calendar.SECOND,0); tempCal.set(Calendar.MILLISECOND,0); return tempCal.getTime(); } /** * 获得日期对象的最后时间,即当日的23:59:59.999,返回Date是一个新对象,不影响传入对象 * @param endDate * @return */ public static Date dateEnd(Date endDate) { if(endDate==null) return null; Date tempDate = dateStart(endDate); // 首先清空当日的时、分、秒、毫秒 tempDate.setTime(tempDate.getTime()+MAX_MILLISECONDS); return tempDate; } /** * 获得日期对象的最开始时间,即当日的00:00:00.000,返回Date是一个新对象,不影响传入对象 * @param startDate * @return */ public static synchronized Date dateStartSync(Date startDate) { if(startDate==null) return null; _tempCal.setTime(startDate); _tempCal.set(Calendar.HOUR_OF_DAY,0); _tempCal.set(Calendar.MINUTE,0); _tempCal.set(Calendar.SECOND,0); _tempCal.set(Calendar.MILLISECOND,0); return _tempCal.getTime(); } /** * 获得日期对象的最后时间,即当日的23:59:59.999,返回Date是一个新对象,不影响传入对象 * @param endDate * @return */ public static synchronized Date dateEndSync(Date endDate) { if(endDate==null) return null; Date tempDate = dateStart(endDate); // 首先清空当日的时、分、秒、毫秒 tempDate.setTime(tempDate.getTime()+MAX_MILLISECONDS); return tempDate; } public static void main(String[] args) { Date d = new Date(); System.out.println(DateProcessor.dateStart(d)); System.out.println(DateProcessor.dateEnd(d)); } } 现在的场景是,我一次可能有数千条数据要经过处理持久到数据库,但如果使用dateStart、dateEnd方法时,将会产生数千个Calendar对象,所以我特意增加了两个相应的同步方法dateStartSync、dateEndSync,但这样做,程序要频繁为方法加上同步锁,可能达到的效果会得不偿失,请问是用第一种方法好还是第二钟方法好呢?请各位发表意见。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-10-20
johnnylzb 写道 现在的场景是,我一次可能有数千条数据要经过处理持久到数据库,但如果使用dateStart、dateEnd方法时,将会产生数千个Calendar对象,所以我特意增加了两个相应的同步方法dateStartSync、dateEndSync,但这样做,程序要频繁为方法加上同步锁,可能达到的效果会得不偿失,请问是用第一种方法好还是第二钟方法好呢?请各位发表意见。 产生多个Calendar对象有什么问题么?这不是一个重量级的调用。 同步不好。 前个问题可以加CPU和内存以有效的提高性能,但你这样一同步,再好的机器提升也有限哪。 |
|
返回顶楼 | |
发表时间:2006-10-20
同步所带来的性能耗损真的会比产生数千个临时对象的耗损还大吗?
|
|
返回顶楼 | |
发表时间:2006-10-20
多余的操作。完全没必要。
重新进行分析和设计吧。就取系统时间很好,绝对不会有什么查询方面的问题。 |
|
返回顶楼 | |
发表时间:2006-10-20
date放到成员变量里,加以volatile修饰,每次进入方法先初始化,不知可以不?
|
|
返回顶楼 | |
发表时间:2006-10-20
写个简单的程序测试一下运行时间不难吧?
|
|
返回顶楼 | |
发表时间:2006-10-20
性能的优化应该建立在测试的基础上
|
|
返回顶楼 | |
发表时间:2006-10-20
together 写道 多余的操作。完全没必要。
重新进行分析和设计吧。就取系统时间很好,绝对不会有什么查询方面的问题。 个人认为有问题,如果放进数据库的时候不作处理,直接用Date,就会出现如下情况,举例: start_date = 2006-10-20 12:10:10.547 end_date = 2006-12-20 12:10:10.876 然后如果我要查询2006-12-20日的数据,而用于查询的Date对象是2006-12-20 13:10:10.876,那么就无法查到2006-12-20的13:10:10.876之前时间的数据,这样就会造成不准确。 所以在放入数据库时候,要进行处理,使数据变成: start_date = 2006-10-20 00:00:00.000 end_date = 2006-12-20 59:59:159.999 |
|
返回顶楼 | |
发表时间:2006-10-20
请你详细描述你这样做的原因和目的。
我并不知道你这两个字段分别代表了什么含义。 无论是时间段查询,还是只按日期查询,都不需要你来这样设计。 总结一下: 为什么需要设计两个时间,它们的作用分别是什么。 你需要用什么方式来返回什么结果? 老实说,日期段的处理,我做过的系统中应用的很多。没有你这样用的。 |
|
返回顶楼 | |
发表时间:2006-10-20
同意together的意见
为了达到你查询和统计的“方便性”,你更改了存储到数据库中的时间,就失去业务的含义了 为什么不想想处理你的date条件参数呢 |
|
返回顶楼 | |