Java代码效率,存储数据与方法调用

时间:2013-05-24 16:16:10

标签: java performance jvm

我对java中的代码效率有疑问。我目前有一个类似于以下

的方法
public class Response extends SuperResponse {

private Object ConfigureResponse = null;

public String getId() {
    if(this.getBody() == null || this.getBody().isEmpty()) {
        return null;
    } else {
        // Check if the ConfigureResponse has already been deserialized
        // if it has, there is no need to deserialize is again

        if(ConfigureResponse == null) {
            ConfigureResponse = JAXB.unmarshal(new StringReader(
                    this.getBody()), Object.class);
        }
        return ConfigureResponse.getConfigureResponse().getId();
    }
}
}// End class

如果重复调用getId方法,最好保存Id字符串并直接返回,并保存自己的方法调用以返回它吗?或者Java编译器足够智能,可以直接转换这些方法调用。

3 个答案:

答案 0 :(得分:6)

编译器无法进行此类优化,但JVM随着时间的推移能够强烈优化此类方法,但前提是它们经常被调用。这显然需要时间,因此如果:

  • getId方法调用的方法非常耗时且
  • 这里至关重要的是,你确定它们是你的应用程序的性能瓶颈,因为“过早优化是所有邪恶的根源”

然后最好引入getId结果的缓存,可以通过以下方式实现:

  • 向班级Response添加新属性:

    private String id;
    
  • getId方法重命名为populateId

  • 使用此类代码创建新的getId方法:

    public String getId() {
        if (this.id != null) {
            return this.id;
        } 
        this.id = populateId();
        return this.id;
    }
    

答案 1 :(得分:1)

would it be better practice to save the Id string and return that directly

在这种情况下,没有。调用getter是一个快速的操作,因此你无法获得足够的证据来证明一个潜在错误的新变量。

如果你以后看到一些缓慢,如果非常必要的话,仍然需要添加这个变量

Premature optimization is evil

答案 2 :(得分:0)

不,编译器不够智能。根据我的经验,最好直接返回字符串并节省一些时间。