1

我对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 编译器是否足够智能,可以直接转换这些方法调用。

4

3 回答 3

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;
    }
    
于 2013-05-24T16:18:57.980 回答
1

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

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

如果您稍后看到一些缓慢,如果非常必要,仍然是时候添加这个变量

Premature optimization is evil

于 2013-05-24T16:22:49.583 回答
0

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

于 2013-05-24T16:22:41.830 回答