calendar.getInstance()或calendar.clone()

Ara*_*ram 31 java performance

我需要复制一个给定日期100次(我不能通过参考传递).我想知道下面哪两个是更好的选择

newTime=Calendar.getInstance().setTime(originalDate);
Run Code Online (Sandbox Code Playgroud)

要么

newTime=originalDate.clone();
Run Code Online (Sandbox Code Playgroud)

表演在这里是主要的.

谢谢.

arm*_*ino 35

我会用

newTime= (Calendar) originalDate.clone();
Run Code Online (Sandbox Code Playgroud)

  • 你为什么要用它而不是'新'? (20认同)
  • 我猜你忘了(日历)演员 (15认同)
  • `originalDate.clone();`为你提供`View`.因此,我们需要将其转换为日历,如@tviana所述:`Calendar newTime =(Calendar)originalDate.clone();` (2认同)

Chr*_*her 31

  1. 我的直觉告诉我,clone()会更快.
  2. 为什么不试试快速基准[*]?
  3. date.getTime()如果您不必进行日历计算,请考虑仅使用长值.

[*]

private static final int N = 100000;

public static void main(final String[] args) throws Exception {

    final Date date = new Date();

    {
        final long start = System.currentTimeMillis();
        for (int i = 0; i < N; i ++) {
            final Date date2 = (Date) date.clone();
        }
        final long end = System.currentTimeMillis();
        System.out.println("Clone: " + (end - start) + " ms");
    }
    {
        final long start = System.currentTimeMillis();
        for (int i = 0; i < N; i ++) {
            final Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            final Date date2 = cal.getTime();
        }
        final long end = System.currentTimeMillis();
        System.out.println("Caldendar.setTime: " + (end - start) + " ms");
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

Clone: 13 ms
Caldendar.setTime: 317 ms
Run Code Online (Sandbox Code Playgroud)

PS我不确定,如果你真的需要a Calendar或者a Date,那么随意修改测试......

(回应评论:为了提高测试准确性,您还可以单独运行测试,增加N的值,......)

  • @Steve:这很容易做到:只需注释掉你不想运行的那个......对我来说,它不会改变结果。实际上,无论如何它都无关紧要,因为*第二* 一个更慢......(顺便说一句,我只是想以非常简短的格式提供一种简单,快速和肮脏的测试方法) (2认同)
  • 克隆日历的4种方法的时间安排:http://tadtech.blogspot.com/2007/03/performance-clone-vs-new.html (2认同)