2

我在读这个:http: //developer.android.com/training/articles/perf-tips.html

特别是关于内部 getter 和 setter:

虚拟方法调用很昂贵,比实例字段查找要贵得多。遵循常见的面向对象编程实践并在公共接口中使用 getter 和 setter 是合理的,但在类中,您应该始终直接访问字段。

如果没有 JIT,直接字段访问比调用普通 getter 快大约 3 倍。使用 JIT(直接字段访问与访问本地一样便宜),直接字段访问比调用普通 getter 快约 7 倍。

它提到了“虚拟方法调用”,它可能也指公共方法。我的班级中有一堆方法不应该被覆盖。例如:

public class Something {
    private float m_Float = 0.0f;
    public float getFloat () {
        return m_Float;
    }
}

我总是希望“getFloat()”返回“m_Float”,即使在派生类中也是如此。将方法标记为“最终”是否会提高 Android 设备的性能?即使不是,最终正确性与 const 正确性一样重要吗?就像,当同事忘记最终正确性时,Java 程序员会发脾气吗?

如果标记该方法final可以提高性能,那么以下性能增益是否无效?

public class Base {
    public int getRandomNumber () {
        return 4; //chosen by fair dice roll.
                  //guaranteed to be random.
    }
}
public class Derived extends Base {
    public final int getRandomNumber () {
        return 6; //chosen by second fair dice roll.
                  //guaranteed to be more random.
    }
}

在这一点上,我对优化我的代码并不感兴趣,但我对最终正确性位感兴趣。我不熟悉 Java 所关注的标准约定。

[编辑]

好的,所以,在上面,这个链接作为一个可能的答案给出:Android Performance - 'Avoid Internal Getters/Setters'

标记为答案的回复链接到此:我可以从 Dalvik 和 Android 工具链中获得哪些优化?

似乎现在内联了简单的 getter 和 setter。

在 Gingerbread 中,我们为 getter/setter 添加了简单的内联。由于底层的 JIT 前端仍然是简单的基于跟踪的,如果被调用者在那里有分支,它将不会被内联。但是实现了内联缓存机制,以便可以毫无问题地内联虚拟 getter/setter。

在评论中,有人问:

(3) 我应该尽可能将我的方法声明为 final 吗?或者这仍然算作虚拟呼叫站点吗?

这是回复:

(3) 是的,请

所以,有了这里的评论等等,我想说一切都解决了。(除了何时final应该与方法一起使用;但这可能很快就会得到回答。我有一个信念,但正在等待它得到验证或有理由的反驳,所以..)

[编辑]

此外,这是否意味着 Android 文档。关于性能提示是..过时的?

4

1 回答 1

1

就个人而言,我建议不要使用final除常量以外的任何东西。在相当长的几年的发展中,我真的没有看到常量的final其他用途。static final ...当涉及到测试时,这个final关键字特别令人烦恼——如果你真的想要高测试覆盖率,java.net.URL就需要使用PowerMockfinal class之类的东西。

如有疑问,请开发现实的性能测试并分析这两种情况。如果没有明显的区别,则不要final在代码中添加限制。像这样的陈述:

直接字段访问比调用普通 getter 快约 3 倍

没有一些实数是完全没有意义的。如果调用一个微不足道的 getter 只需要 20 微秒,那么将成本增加到 60 微秒是没有意义的。对于移动应用程序,getter 和 setter 不会导致您的性能问题。

始终首先编写正确性,其次是可读性,然后是可维护性。

于 2013-06-18T23:02:31.087 回答