11

以前,当我第一次设计股票应用相关的软件时,我决定用它java.util.Date来表示股票的日期/时间信息。

后来,我意识到其中的大多数方法java.util.Date已被弃用。因此,很快,我重构了所有代码以使用java.util.Calendar

但是,我遇到了两个缺点。

  1. 构造java.util.Calendar比较慢java.util.Date
  2. 在类的访问器 getCalendar 方法中Stock,我需要克隆一个副本,就像Calendar一个可变类一样

这是Stock.java的当前源代码

最近,我发现了Joda-Time。我通过创建1,000,000java.util.Date和. 我发现在实例化过程中性能比, 好。java.util.Calendarorg.joda.time.DateTimeorg.joda.time.DateTimejava.util.Calendar

这是基准测试替代文字结果。

这种实例化速度很重要,尤其是会创建许多 Stocks 实例,以表示股票的长期价格历史。

您认为从 Java 日历迁移到 Joda Date Time 以获得应用程序速度性能是否值得?有什么需要注意的陷阱吗?

4

5 回答 5

12

请注意,它java.util.Date也是可变的 - 所以如果现在您正在使用Calendar它是一个问题,那么它也将是一个问题Date。也就是说,使用 Joda Time绝对值得一试,因为它是一个非常非常好的 API。

您有多确定性能实际上是您的特定应用程序中的一个问题?你说会有“许多实例”Stock创建......有多少?你剖析过吗?我不希望它在大多数情况下实际上会产生重大影响。从您的基准测试图中看不出您实际测量的是什么。

总体而言,迁移到 Joda Time 是一个好主意,但我会衡量性能,看看它对你有多大影响。

于 2010-10-28T15:03:38.200 回答
2

为什么你的班级需要Calendar一个Stock?我认为使用 aDate来表示一个时间点很好。这似乎是您想要的,因为您希望Calendara 股票中的对象是不可变的Date,如果您忽略不推荐使用的方法,则该类应该是不可变的。

Calendar当您需要Date在类外进行时间操作时,您可以使用临时Stock

Calendar calendar = Calendar.getInstance();
calendar.setTime(stock.getDate());
System.out.println(calendar.getYear());

像这样你仍然可以Date在你的类中存储 a ,当只存储和检索数据存储中的对象Stock时,它应该具有最佳性能。Stock如果您一次执行多个操作,您还可以重用同一个Calendar对象。

如果您不喜欢该Calendar界面,您仍然可以使用 Joda Time 进行时间操作。如果需要,您可能可以将日期与 Joda Time 相互转换,以进行时间操作,并且仍然将Date对象存储在您的Stock类中。

于 2010-10-28T15:56:15.480 回答
2

如果java.util.Calendar要替换的实例org.joda.time.DateTime解析和/或格式化为特定模式,例如

String format = "YYYY-MM-dd HH:mm:ss";
  1. 在参数和返回类型以及变量声明的方法签名中

和实例化,替换类名的整个单词Calendar出现(使用

DateTime) 和SimpleDateFormat(with DateTimeFormatter) 分别

  1. 替换格式化程序实例化语句,例如

    formatter = new SimpleDateFormat(format);
    

    formatter = DateTimeFormat.forPattern(format);
    
  2. 替换对“SimpleDateFormat”方法的调用,例如

    String dateStr = formatter.format(Calendar.getInstance().getTime());
    

    String dateStr = DateTime.now().toString(formatter);
    

    formatter.parse(dateStr);
    

    DateTime.parse(dateStr, formatter);
    
于 2016-07-08T14:08:12.707 回答
1

我过去使用过 Joda,它是一个很棒的库。

不幸的是,就性能而言,您必须对其进行测试。但是重构你的代码似乎太多了。就个人而言,我Date在整个应用程序(包括数据库存储和检索)中都使用过,并且仅在需要数据操作时才使用 Joda。Joda 只在需要时才计算字段,所以我猜开销会比使用 Java API 类低很多;此外,您不会遇到对象版本问题来传输和处理Date数据库中的对象、序列化对象等。我不希望 Joda 打破这种兼容性,但不太可能使用Date.

于 2010-10-28T15:11:07.410 回答
0

一般来说,搬到 joda-time 总是更好。但是,根据与日期使用有关的用例,将项目转移到 joda-time 确实值得。查看演示文稿中的第 46 张幻灯片,了解一些操作链接文本的性能相关数字

于 2010-10-28T15:28:33.733 回答