从Java日历迁移到Joda日期时间
以前,当我第一次设计股票应用程序相关软件时,我决定使用java.util.Date
来表示股票的日期/时间信息。
后来,我意识到java.util.Date
大多数方法java.util.Date
弃用。 因此,很快,我重构了所有代码以使用java.util.Calendar
但是,我遇到了两个缺点。
- 构造
java.util.Calendar
比java.util.Date
慢 - 在
Stock
类的访问器getCalendar方法中,我需要克隆一个副本,因为Calendar
是一个可变类
这是Stock.java的当前源代码
最近,我发现了Joda-Time 。 我通过创建1,000,000 java.util.Date
, java.util.Calendar
和org.joda.time.DateTime
进行以下基准测试。 在实例化期间,我发现org.joda.time.DateTime
比java.util.Calendar
表现更好。
这是基准测试 结果。
此实例化速度很重要,尤其是将创建许多Stocks实例,以表示股票的长期价格历史。
您认为从Java Calendar迁移到Joda Date Time是否值得获得应用程序速度性能? 我需要注意什么陷阱?
请注意, java.util.Date
也是可变的 – 所以如果现在你正在使用Calendar
,那么使用Date
也会出现问题。 也就是说,使用Joda Time 绝对值得做,因为它是一个更好,更好的API。
您的特定应用程序中的性能实际上是一个问题,您有多确定? 你说Stock
会有“很多实例”……有多少? 你有没有描述过它? 我不希望它在大多数情况下实际上有显着差异。 从您的基准测试图中看,您实际测量的内容并不明显。
转移到Joda Time一般来说是一个好主意,但我会测量性能,看看它真正给你带来了多大的不同。
为什么在Stock
类中需要一个Calendar
? 我认为使用Date
代表一个时间点是好的。 这似乎是你想要的,因为如果忽略不推荐使用的方法,你希望库存中的Calendar
对象是不可变的, Date
类应该是不可变的。
当您需要在Stock
类之外的Date
上执行时间操作时,可以使用临时Calendar
:
Calendar calendar = Calendar.getInstance(); calendar.setTime(stock.getDate()); System.out.println(calendar.getYear());
像这样,您仍然可以在Stock
类中存储Date
,当仅从数据存储中存储和检索Stock
对象时,该类应该具有最佳性能。 如果您一次执行多个操作,也可以重用相同的Calendar
对象。
如果您不喜欢Calendar
接口,您仍然可以使用Joda Time来执行时间操作。 如果需要,您可以将日期转换为Joda Time,以及进行时间操作,并且仍然将Date
对象存储在Stock
类中。
如果要用org.joda.time.DateTime
替换的java.util.Calendar
实例被解析和/或格式化为特定模式 ,例如
String format = "YYYY-MM-dd HH:mm:ss";
- 在参数和返回类型的方法签名中,以及变量声明
和实例化,重新调整类名称Calendar
整个单词出现次数
DateTime
)和SimpleDateFormat
(使用DateTimeFormatter
)
-
替换格式化程序实例化语句,例如
formatter = new SimpleDateFormat(format);
同
formatter = DateTimeFormat.forPattern(format);
-
将调用替换为`SimpleDateFormat’的方法,例如
String dateStr = formatter.format(Calendar.getInstance().getTime());
同
String dateStr = DateTime.now().toString(formatter);
和
formatter.parse(dateStr);
同
DateTime.parse(dateStr, formatter);
我过去使用过Joda,它是一个很棒的库。
在性能方面,不幸的是你必须测试它。 但重构你的代码似乎太多了。 就个人而言,我在整个应用程序中使用了Date
(包括DB存储和检索),并且仅在我需要数据操作时才使用Joda。 Joda只在需要时计算字段,所以我猜测开销会比使用Java API类低得多; 此外,您不会有对象版本问题来传输和处理数据库中的Date
对象,序列化对象等。 我不认为Joda会破坏这种兼容性,但使用Date
可能性较小。
总的来说,移动到joda-time总是更好。 但是,根据您与日期使用相关的使用情况,您的项目移动到joda-time是非常值得的。 查看演示文稿中的幻灯片编号46,了解某些操作链接文本的性能相关数字