【问题标题】:Access static fields directly instead of calling a static getter method, is it faster?直接访问静态字段而不是调用静态getter方法,是不是更快?
【发布时间】:2012-02-16 11:49:41
【问题描述】:

我正在编写一个 Android 应用程序,我有一个类可以生成和维护一些固定的 URL,这些 URL 有时会发生变化。我将它们都放在一个名为 UrlUtils 的类中:

public class UrlUtils {
  private static String sUrlBase = "http://google.com";

  /**
   * Called occasionally
   */
  public static void refreshUrlBases() {
        sUrlBase = "http://yahoo.com/" + new Random().nextInt();
  }

   public static String getUrlBase() {
        return sUrlBase;
   }
}

我必须多次调用上面的getUrlBase(),所以我正在考虑将sUrlBase公开并直接访问它。这种方法在性能方面会更好吗?

【问题讨论】:

  • 保持良好的设计实践,除非您已经对应用进行了概要分析并且知道此 getter 调用占用了不成比例的时间。

标签: java android dalvik performance


【解决方案1】:

是的,出于性能原因,您应该避免使用 getter 和 setter。这是来自 android "Designing for performance" 文档的提示。

在没有 JIT 的情况下,直接字段访问比调用 微不足道的吸气剂。使用 JIT(直接字段访问与 访问本地),直接字段访问比直接访问快 7 倍 调用一个微不足道的吸气剂。这在 Froyo 中是正确的,但会在 JIT 内联 getter 方法的未来。

【讨论】:

  • 现在,Proguard 优化已完全内置在 Android SDK 中。我确信 Proguard 会内联 getter,因此,优化器会让你两全其美。
  • 在该页面的最顶部,它还显示“明智地优化”,只有在您知道存在问题时才进行优化。
  • @Sean:我在developer.android.com/guide/practices/design/… 中找不到关于 Proguard 的单一参考。你知道我在哪里可以找到 Proguard 所做的优化吗?
  • @Sean 找不到任何表明 Proguard 优化了 getter 和 setter 的内容。看看 Yury 发送的链接。
  • 您是否看到“短或仅调用一次的内联方法。”?
【解决方案2】:

如果你不打算更频繁地更改你的网址,那么我会说你可以直接保留static而不是getter/setter方法

public static String google_url = "http://google.com";
public static String yahoo_url  = "http://yahoo.com";

在保持static 方法的过程中,由于某些问题,static setter 的值可能是removed(重置为原始值)。因此,在这种情况下,它将返回 original 常量 static 值。

更新:

如果您要更新您的URL dynamically,那么static method 将被证明是更好的选择。

    public static String sUrlBase = "http://google.com"; 

    public static String getsUrlBase() {
        return sUrlBase;
    }
    public static void setsUrlBase(String sUrlBase) {
        this.sUrlBase = sUrlBase;
    }

【讨论】:

  • 我需要在refreshUrlBases() 中动态生成 URL,所以这不起作用。 (编辑示例代码以反映这一点。)
【解决方案3】:

没有区别。您应该使用对您来说最简单的方法。通常你应该使用 getter 和 setter 来提高可读性和代码实践。

【讨论】:

    【解决方案4】:

    在这种情况下,我通常不会太担心像 URL 这样的小型简单数据的性能,因此无论是直接字段访问还是使用方法访问都不会打扰我。 对我来说会有所不同的情况是,getter 调用的频率如此之高以至于影响了整体响应。 我担心会意外更改值 [错误 :( ],因为该字段具有公共静态访问权限。通过 getter/setter 访问时,至少有一个地方可以进行检查。

    【讨论】:

    • 这也是我的主要担心。但至少在某些情况下,性能优势似乎太大了,不容忽视。
    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多