System.currentTimeMillis()与新的Date()与Calendar.getInstance()。getTime()
在Java中,使用的性能和资源含义是什么
System.currentTimeMillis()
与
new Date()
与
Calendar.getInstance().getTime()
据我所知,System.currentTimeMillis()是最有效的。 然而,在大多数应用中,长期价值需要转化为date或类似的对象来对人类做任何有意义的事情。
System.currentTimeMillis()
显然是最高效的,因为它甚至不创build一个对象,但是new Date()
实际上只是一个很长的包装器,所以它并不遥远。 另一方面, Calendar
相对较慢且非常复杂,因为它必须处理date和时间(闰年,夏时制,时区等)固有的相当复杂和所有古怪的事情。
在应用程序中处理较长的时间戳或Date
对象通常是一个好主意,只有在实际需要执行date/时间计算时才使用“ Calendar
,或格式化将date显示给用户的date。 如果你不得不做很多这样的事情,那么使用Joda Time可能是一个好主意,因为界面更干净,性能更好。
看着JDK, Calendar.getInstance()
最里面的构造函数是这样的:
public GregorianCalendar(TimeZone zone, Locale aLocale) { super(zone, aLocale); gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone); setTimeInMillis(System.currentTimeMillis()); }
所以它已经自动做你的build议。 date的默认构造函数持有这个:
public Date() { this(System.currentTimeMillis()); }
所以实际上并不需要专门的系统时间,除非你想在创build日历/date对象之前用它做一些math运算。 此外,如果您的目的是使用date计算,我必须推荐使用joda时间来替代Java自己的日历/date类。
如果您使用date,那么我强烈build议您使用jodatime, http: //joda-time.sourceforge.net/。 使用System.currentTimeMillis()
作为date的字段听起来像是一个非常糟糕的主意,因为最终会产生大量无用的代码。
date和日历都严重受损,而日历绝对是他们所有人中performance最差的。
我build议你使用System.currentTimeMillis()
当你实际上运行毫秒,例如像这样
long start = System.currentTimeMillis(); .... do something ... long elapsed = System.currentTimeMillis() -start;
我更喜欢使用由System.currentTimeMillis()
返回的值来进行各种计算,只有在需要真正显示人类读取的值时才使用Calendar
或Date
。 这也将防止99%的夏令时错误。 🙂
在我的机器上,我试着检查它。 我的结果:
Calendar.getInstance()。getTime()(* 1000000次)= 402ms new Date()。getTime(); (* 1000000次)= 18ms System.currentTimeMillis()(* 1000000次)= 16ms
不要忘了GC(如果使用Calendar.getInstance()
或new Date()
)
根据您的应用程序,您可能需要考虑使用System.nanoTime()
。
我试过这个:
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()
显然是最快的,因为它只有一个方法调用,并且不需要垃圾收集器。