System.currentTimeMillis()与new Date()与Calendar.getInstance()。getTime()

时间:2008-12-15 11:36:55

标签: java performance date time calendar

在Java中,使用

的性能和资源含义是什么?
System.currentTimeMillis() 

VS。

new Date() 

VS。

Calendar.getInstance().getTime()

据我了解,System.currentTimeMillis()是最有效的。但是,在大多数应用程序中,需要将该长值转换为Date或某些类似对象才能对人类执行任何有意义的操作。

8 个答案:

答案 0 :(得分:225)

System.currentTimeMillis()显然是效率最高的,因为它甚至没有创建对象,但new Date()实际上只是一个关于long的瘦包装,所以它不远背后。另一方面,Calendar相对缓慢且非常复杂,因为它必须处理日期和时间(闰年,夏令时,时区等)固有的相当复杂和所有奇怪的问题。

通常最好只处理应用程序中的长时间戳或Date个对象,并且只在实际需要执行日期/时间计算时使用Calendar,或者格式化显示日期他们给用户。如果你必须做很多这样的事情,那么使用Joda Time可能是一个好主意,因为它具有更清晰的界面和更好的性能。

答案 1 :(得分:41)

查看JDK,Calendar.getInstance()的最内层构造函数具有:

public GregorianCalendar(TimeZone zone, Locale aLocale) {
    super(zone, aLocale);
    gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
    setTimeInMillis(System.currentTimeMillis());
}

所以它已经自动完成了你的建议。 Date的默认构造函数包含:

public Date() {
    this(System.currentTimeMillis());
}

所以真的不需要专门获取系统时间,除非你想在用它创建Calendar / Date对象之前用它做一些数学运算。此外,如果您的目的是大量使用日期计算,我还是建议使用joda-time作为Java自己的日历/日期类的替代。

答案 2 :(得分:22)

如果您使用的是约会,那么我强烈建议您使用jodatime,http://joda-time.sourceforge.net/。对{em> 日期的字段使用System.currentTimeMillis()听起来是一个非常糟糕的主意,因为你最终会得到很多无用的代码。

日期和日历都严重受限,而日历绝对是他们所有人中表现最差的。

我建议您在实际操作毫秒时使用System.currentTimeMillis(),例如

 long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;

答案 3 :(得分:12)

在我的机器上,我试过检查一下。我的结果:

Calendar.getInstance().getTime() (*1000000 times) = 402ms
new Date().getTime(); (*1000000 times) = 18ms
System.currentTimeMillis() (*1000000 times) = 16ms

不要忘记GC(如果您使用Calendar.getInstance()new Date()

答案 4 :(得分:12)

我更喜欢使用System.currentTimeMillis()返回的值进行各种计算,如果我需要真正显示人类读取的值,则只使用CalendarDate。这也可以防止99%的夏令时错误。 :)

答案 5 :(得分:7)

根据您的应用程序,您可能需要考虑使用System.nanoTime()

答案 6 :(得分:3)

我试过了:

        long now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            new Date().getTime();
        }
        long result = System.currentTimeMillis() - now;

        System.out.println("Date(): " + result);

        now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            System.currentTimeMillis();
        }
        result = System.currentTimeMillis() - now;

        System.out.println("currentTimeMillis(): " + result);

结果是:

日期():199

currentTimeMillis():3

答案 7 :(得分:0)

System.currentTimeMillis()显然是最快的,因为它只有一个方法调用,不需要垃圾收集器。