Java 局部变量与全局字段 - 性能
Java local variable vs global field - Performance
我有一个私有方法,它将日期作为字符串类型和 returns XMLGregorianCalendar
具有特定格式的对象。从同一 class 中的各种其他方法调用此方法。
定义为 SimpleDateFormat
的格式,每次调用都相同。以下是该方法的两个版本。
版本 1:
private XMLGregorianCalendar getXmlGregorianCalendar(final String strDt) throws ParseException, DatatypeConfigurationException{
Date date = null;
// local variable dtFormat
DateFormat dtFormat = new SimpleDateFormat("yyyy-MM-dd-hh.mm.ss");
if (strDt != null) {
date = dtFormat.parse(strDt);
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
return xmlCal;
}else {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
}
}
版本 2:
// declare date format once, global variable
private DateFormat dtFormat = new SimpleDateFormat("yyyy-MM-dd-hh.mm.ss");
// getter setter for dtFormat
private XMLGregorianCalendar getXmlGregorianCalendar(final String strDt) throws ParseException, DatatypeConfigurationException{
Date date = null;
if (strDt != null) {
date = this.dtFormat.parse(strDt); // of course, getDtFormat() can be used
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
return xmlCal;
}else {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
}
}
版本 1 与版本 2。哪个性能更好?
注意: 随附的 class 被注释为 @Component
并参与为我的网络服务创建响应。
SimpleDateFormat
不是线程安全的,因此需要考虑这一点。性能与这个问题关系不大,除非你真的没有任何其他性能热点(这会令人惊讶)。
但是您可以使用 ThreadLocal
SimpleDateFormat
,但请记住 ThreadLocals
有自己的问题,这可能并不重要。
如果 SimpleDateFormat
是一个常量,您可以将其设置为 static final
并且它会稍微提高您的性能。但是你应该知道 static
字段在 classes 中的概念。 static
字段 在内存中为 @Component class 的所有实例 分配一次。因此,如果这不会在您的代码中造成错误,最好使用 static final
关键字将其定义为常量。
我有一个私有方法,它将日期作为字符串类型和 returns XMLGregorianCalendar
具有特定格式的对象。从同一 class 中的各种其他方法调用此方法。
定义为 SimpleDateFormat
的格式,每次调用都相同。以下是该方法的两个版本。
版本 1:
private XMLGregorianCalendar getXmlGregorianCalendar(final String strDt) throws ParseException, DatatypeConfigurationException{
Date date = null;
// local variable dtFormat
DateFormat dtFormat = new SimpleDateFormat("yyyy-MM-dd-hh.mm.ss");
if (strDt != null) {
date = dtFormat.parse(strDt);
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
return xmlCal;
}else {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
}
}
版本 2:
// declare date format once, global variable
private DateFormat dtFormat = new SimpleDateFormat("yyyy-MM-dd-hh.mm.ss");
// getter setter for dtFormat
private XMLGregorianCalendar getXmlGregorianCalendar(final String strDt) throws ParseException, DatatypeConfigurationException{
Date date = null;
if (strDt != null) {
date = this.dtFormat.parse(strDt); // of course, getDtFormat() can be used
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
return xmlCal;
}else {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
}
}
版本 1 与版本 2。哪个性能更好?
注意: 随附的 class 被注释为 @Component
并参与为我的网络服务创建响应。
SimpleDateFormat
不是线程安全的,因此需要考虑这一点。性能与这个问题关系不大,除非你真的没有任何其他性能热点(这会令人惊讶)。
但是您可以使用 ThreadLocal
SimpleDateFormat
,但请记住 ThreadLocals
有自己的问题,这可能并不重要。
如果 SimpleDateFormat
是一个常量,您可以将其设置为 static final
并且它会稍微提高您的性能。但是你应该知道 static
字段在 classes 中的概念。 static
字段 在内存中为 @Component class 的所有实例 分配一次。因此,如果这不会在您的代码中造成错误,最好使用 static final
关键字将其定义为常量。