calendar.getInstance()或calendar.clone()

时间:2010-04-07 20:19:20

标签: java performance

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

newTime=Calendar.getInstance().setTime(originalDate);

OR

newTime=originalDate.clone();

表演是这里的主要内容。

THX。

5 个答案:

答案 0 :(得分:34)

我会用

newTime= (Calendar) originalDate.clone();

答案 1 :(得分:30)

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

    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");
        }
    }
    

    结果:

    Clone: 13 ms
    Caldendar.setTime: 317 ms
    

    PS我不确定,如果你真的需要CalendarDate,请随时修改测试......

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

答案 2 :(得分:2)

在Scala中,我会执行 clone(),并使用 .asInstanceOf [Calendar] 执行强制转换为日历:

val now = Calendar.getInstance()
val newDate = now.clone().asInstanceOf[Calendar]

答案 3 :(得分:1)

我的方法是选择选项1),然后确保应用程序已完全分析以检查瓶颈。可能是上述代码在一天结束时在应用程序的整体性能方面根本不是问题。

答案 4 :(得分:1)

  

我不能通过参考传递

你肯定不能。 Java中没有这样的东西。但我会审查这个要求。如果您一直传递相同的日期,有人会修改日期的实际风险是什么?你能控制一下吗?例如通过在每次调用之前和之后检查getTime(),并在它发生变化时抛出RTE?