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()返回的值来进行各种计算,只有在需要真正显示人类读取的值时才使用CalendarDate 。 这也将防止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()显然是最快的,因为它只有一个方法调用,并且不需要垃圾收集器。