在Java中,使用什么会对性能和资源产生影响?
System.currentTimeMillis()
对比。
new Date()
对比。
Calendar.getInstance().getTime()
据我所了解,System.currentTimeMillis()
是最有效的方法。然而,在大多数应用程序中,需要将这个长整型值转换为日期或某些类似的对象,以便对人类有意义。
在Java中,使用什么会对性能和资源产生影响?
System.currentTimeMillis()
对比。
new Date()
对比。
Calendar.getInstance().getTime()
据我所了解,System.currentTimeMillis()
是最有效的方法。然而,在大多数应用程序中,需要将这个长整型值转换为日期或某些类似的对象,以便对人类有意义。
System.currentTimeMillis()
显然是最高效的,因为它甚至不创建对象,但 new Date()
只是一个对 long 做了简单封装的薄膜,所以它的效率也很高。另一方面,Calendar
相对较慢且非常复杂,因为它必须处理与日期和时间相关的所有复杂性和怪异问题(闰年、夏令时、时区等)。
通常建议在应用程序中仅处理 long 类型的时间戳或 Date
对象,并且只在实际需要执行日期/时间计算或格式化日期以将其显示给用户时使用 Calendar
。如果你需要频繁进行此类操作,那么使用 Joda Time 可能是个好主意,因为它具有更清晰的接口和更好的性能。
查看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());
}
所以,除非你在创建日历/日期对象之前需要进行一些数学计算,否则真的不需要特别获取系统时间。此外,如果你的目的是频繁进行日期计算,我必须推荐使用joda-time作为Java自带的日历/日期类的替代。
System.currentTimeMillis()
听起来是一个非常糟糕的想法,因为你最终会得到很多无用的代码。System.currentTimeMillis()
,例如像这样: long start = System.currentTimeMillis();
.... do something ...
long elapsed = System.currentTimeMillis() -start;
nanoTime()
是一个始终递增的计数器,它永远不会返回比在此 JVM 实例中上次调用的时间更短的值。currentTimeMillis()
可能会返回比上次调用的时间更短的值,因为系统时间被改变了,例如 NTP 时钟同步。 - griffinjm在我的机器上,我尝试进行了检查。我的结果:
Calendar.getInstance().getTime() (*1000000 次) = 402ms new Date().getTime(); (*1000000 次) = 18ms System.currentTimeMillis() (*1000000 次) = 16ms
不要忘记GC(如果您使用 Calendar.getInstance()
或 new Date()
)
我更喜欢使用System.currentTimeMillis()
返回的值进行所有类型的计算,仅在需要真正显示人类可读取的值时才使用Calendar
或Date
。这还将防止99%的夏令时错误。:)
根据您的应用程序,您可能希望考虑使用System.nanoTime()
。
nanoTime
返回的时间是相对的(通常是相对于程序的启动时间),如果您尝试将其转换为日期,则会变成无意义的东西。 - Dunes 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);
结果如下:
Date():199
currentTimeMillis():3
System.currentTimeMillis()
显然是最快的,因为它只需要一个方法调用,而且不需要垃圾回收器。