以前,当我第一次设计与股票应用程序相关的软件时,我决定使用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
。
以下是基准结果。
此实例化速度非常重要,尤其是创建了很多股票实例,以表示股票的长期价格历史。
您认为从Java Calendar迁移到Joda Date Time是否值得获得应用程序速度性能?我需要注意什么陷阱?
答案 0 :(得分:11)
请注意,java.util.Date
也是可变的 - 如果现在使用Calendar
是个问题,那么使用Date
也会出现问题。也就是说,使用Joda Time 肯定值得做,因为它是一个更好,更好的API。
您在某个特定应用中的性能实际上是多么肯定?你说Stock
会创建“多个实例”......有多少?你有没有介绍过它?在大多数情况下,我不希望它真正发挥显着作用。从您的基准测试图中看,您实际测量的内容并不明显。
转移到Joda Time一般来说是一个好主意,但我会测量性能,看看真正给你带来多大的差异。
答案 1 :(得分:2)
为什么在Calendar
课程中需要Stock
?我认为使用Date
代表一个时间点是好的。这似乎是你想要的,因为如果忽略不推荐使用的方法,你希望库存中的Calendar
对象是不可变的,Date
类应该是。
当您需要在Calendar
级别之外的Date
执行时间操作时,您可以使用临时Stock
:
Calendar calendar = Calendar.getInstance();
calendar.setTime(stock.getDate());
System.out.println(calendar.getYear());
像这样,你仍然可以在Date
类中存储Stock
,当只从数据存储中存储和检索Stock
个对象时,它应该具有最佳性能。如果您一次执行多个操作,也可以重用相同的Calendar
对象。
如果您不喜欢Calendar
界面,您仍然可以使用Joda Time来执行时间操作。您可以根据需要将日期转换为Joda Time,也可以转换为时间操作,并且仍然会在Date
类中存储Stock
个对象。
答案 2 :(得分:2)
如果java.util.Calendar
要替换为org.joda.time.DateTime
的实例被解析和/或格式化为特定模式,例如
String format = "YYYY-MM-dd HH:mm:ss";
和实例化,repace 整个单词出现的类名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);
答案 3 :(得分:1)
我过去使用过Joda,它是一个很棒的库。
在性能方面,不幸的是你必须测试它。但重构你的代码似乎太多了。就个人而言,我在整个应用程序中使用Date
(包括数据库存储和检索),并且仅在我需要数据操作时才使用Joda。 Joda只在需要时计算字段,所以我猜测开销会比使用Java API类低得多;此外,您不会有对象版本问题来传输和处理数据库中的Date
对象,序列化对象等。我不认为Joda会破坏这种兼容性,但使用Date
的可能性较小。
答案 4 :(得分:0)
总的来说,移动到joda-time总是更好。但是,根据您与日期使用相关的使用情况,您的项目移动到joda-time是非常值得的。请查看演示文稿中的幻灯片编号46,了解某些操作link text
的性能相关数字