在Java中,使用的性能和资源含义是什么
System.currentTimeMillis()
与
new Date()
与
Calendar.getInstance().getTime()
据我了解,System.currentTimeMillis()是最有效的.但是,在大多数应用程序中,需要将该长值转换为Date或某些类似对象,以对人类执行任何有意义的操作.
System.currentTimeMillis()
显然是最有效的,因为它甚至没有创建一个对象,但new Date()
实际上只是一个很长的薄包装,所以它不会落后.Calendar
另一方面,它相对缓慢而且非常复杂,因为它必须处理日期和时间(闰年,夏令时,时区等)固有的相当复杂和所有奇怪的问题.
通常最好只处理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()); }
所以真的不需要专门获得系统时间,除非你想在用它创建Calendar/Date对象之前用它做一些数学运算.另外,如果您的目的是大量使用日期计算,我必须建议使用joda-time作为Java自己的日历/日期类的替代品.
如果您正在使用约会,那么我强烈建议您使用jodatime,http: //joda-time.sourceforge.net/ .使用System.currentTimeMillis()
该字段是日期听起来像一个非常糟糕的主意,因为你有很多无用的代码而告终.
日期和日历都严重受挫,而日历绝对是他们所有人中表现最差的.
我建议你System.currentTimeMillis()
在实际操作毫秒时使用,例如像这样
long start = System.currentTimeMillis(); .... do something ... long elapsed = System.currentTimeMillis() -start;
我更喜欢使用返回的值System.currentTimeMillis()
进行各种计算,只使用Calendar
或者Date
我需要真正显示人类读取的值.这也可以防止99%的夏令时错误.:)
在我的机器上,我试过检查它.我的结果:
Calendar.getInstance().getTime() (*1000000 times) = 402ms new Date().getTime(); (*1000000 times) = 18ms System.currentTimeMillis() (*1000000 times) = 16ms
不要忘记GC(如果你使用Calendar.getInstance()
或new Date()
)
根据您的应用程序,您可能需要考虑使用System.nanoTime()
.