在Java中,使用的性能和资源含义是什么
System.currentTimeMillis()
vs.
new Date()
vs.
Calendar.getInstance().getTime()
根据我的理解,System.currentTimeMillis()是最有效的。但是,在大多数应用程序中,需要将该长值转换为Date或一些类似的对象,才能执行对人类有意义的操作。
在Java中,使用的性能和资源含义是什么
System.currentTimeMillis()
vs.
new Date()
vs.
Calendar.getInstance().getTime()
根据我的理解,System.currentTimeMillis()是最有效的。但是,在大多数应用程序中,需要将该长值转换为Date或一些类似的对象,才能执行对人类有意义的操作。
当前回答
System.currentTimeMillis()显然是最有效的,因为它甚至不创建对象,但new Date()实际上只是一个关于长对象的薄包装,因此它并不落后。另一方面,日历相对缓慢且非常复杂,因为它必须处理日期和时间固有的相当复杂和所有奇怪的事情(闰年、夏令时、时区等)。
在应用程序中只处理长时间戳或Date对象,并且只在实际需要执行日期/时间计算时使用Calendar,或者格式化日期以便向用户显示它们,这通常是一个好主意。如果您必须做很多这样的事情,那么使用Joda Time可能是个好主意,可以获得更简洁的界面和更好的性能。
其他回答
根据应用程序的不同,您可能会考虑使用System.nanoTime()。
我更喜欢使用System.currentTimeMillis()返回的值进行各种计算,如果我需要真正显示由人类读取的值,则只使用Calendar或Date。这也可以防止99%的夏令时错误。:)
System.currentTimeMillis()显然是最快的,因为它只有一个方法调用,不需要垃圾收集器。
我试了一下:
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):
查看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自己的日历/日期类。