System.currentTimeMillis() vs. new Date() vs. Calendar.getInstance().getTime()

在Java中,使用的性能和资源含义是什么

System.currentTimeMillis()

vs。

new Date()

vs。

Calendar.getInstance().getTime()

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

159201 次浏览

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

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

日期和日历都被严重破坏了,日历绝对是它们中表现最差的。

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

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

查看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自己的日历/日期类。

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

一般来说,在应用程序中只处理长时间戳或Date对象是一个好主意,并且只在实际需要执行日期/时间计算时使用Calendar,或者格式化日期以显示给用户。如果你不得不做很多这样的事情,使用Joda的时间可能是一个好主意,为了更干净的界面和更好的性能。

取决于你的应用程序,你可能想要考虑使用System.nanoTime()代替。

我试着在我的机器上检查。我的结果:

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

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

我试了一下:

        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

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