在Java中,使用
的性能和资源含义是什么?System.currentTimeMillis()
VS。
new Date()
VS。
Calendar.getInstance().getTime()
据我了解,System.currentTimeMillis()是最有效的。但是,在大多数应用程序中,需要将该长值转换为Date或某些类似对象才能对人类执行任何有意义的操作。
答案 0 :(得分:225)
System.currentTimeMillis()
显然是效率最高的,因为它甚至没有创建对象,但new Date()
实际上只是一个关于long的瘦包装,所以它不远背后。另一方面,Calendar
相对缓慢且非常复杂,因为它必须处理日期和时间(闰年,夏令时,时区等)固有的相当复杂和所有奇怪的问题。
通常最好只处理应用程序中的长时间戳或Date
个对象,并且只在实际需要执行日期/时间计算时使用Calendar
,或者格式化显示日期他们给用户。如果你必须做很多这样的事情,那么使用Joda Time可能是一个好主意,因为它具有更清晰的界面和更好的性能。
答案 1 :(得分:41)
查看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自己的日历/日期类的替代。
答案 2 :(得分:22)
如果您使用的是约会,那么我强烈建议您使用jodatime,http://joda-time.sourceforge.net/。对{em> 日期的字段使用System.currentTimeMillis()
听起来是一个非常糟糕的主意,因为你最终会得到很多无用的代码。
日期和日历都严重受限,而日历绝对是他们所有人中表现最差的。
我建议您在实际操作毫秒时使用System.currentTimeMillis()
,例如
long start = System.currentTimeMillis();
.... do something ...
long elapsed = System.currentTimeMillis() -start;
答案 3 :(得分:12)
我更喜欢使用System.currentTimeMillis()
返回的值进行各种计算,如果我需要真正显示人类读取的值,则只使用Calendar
或Date
。这也可以防止99%的夏令时错误。 :)
答案 4 :(得分:12)
在我的机器上,我试过检查一下。我的结果:
Calendar.getInstance().getTime() (*1000000 times) = 402ms new Date().getTime(); (*1000000 times) = 18ms System.currentTimeMillis() (*1000000 times) = 16ms
不要忘记GC(如果您使用Calendar.getInstance()
或new Date()
)
答案 5 :(得分:7)
根据您的应用程序,您可能需要考虑使用System.nanoTime()
。
答案 6 :(得分:3)
我试过了:
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
答案 7 :(得分:0)
System.currentTimeMillis()
显然是最快的,因为它只有一个方法调用,不需要垃圾收集器。