【问题标题】:Which of this 2 options is better for performance?这两个选项中哪一个对性能更好?
【发布时间】:2014-01-05 23:12:01
【问题描述】:

我在我的 Android 应用中使用 Fragments。在这些片段中,我需要一个 Context 对象,以便通过一些方法调用重复使用它(大约 10 次)。

如你所知,我有两个选择:

选项一:

public class MyFragment extends Fragment{
    public void onCreate(Bundle savedInstanceState){
        super(savedInstanceState);

        //call a lot of methods and use getActivity() a lot of times
    }
}

选项二:

public class MyFragment extends Fragment{

    private Activity mActivity;

    public void onCreate(Bundle savedInstanceState){
        super(savedInstanceState);

        mActivity = getActivity();
        //call a lot of methods and use mActivity
    }
}

我知道声明 mActivity 字段需要一些内存(多少?),但我认为调用 getActivity 需要一些 CPU 处理。

这两个选项哪个更好,为什么?


编辑:

嗯,查看Android源代码我可以找到Fragment类中getActivity()方法的来源:

final public FragmentActivity getActivity() {
    return mActivity;
}

所以,如您所见,在 Option II 中 mActivity 被保留了两次,这很浪费内存,所以从现在开始我将使用 Option I。

感谢您的回答,他们让我明白了这一点:)

【问题讨论】:

  • 声明该字段将花费您全部...我认为 8-12 个字节。并且让您不必每次都拨打getActivity()。不过,我不确定如果应用程序未腌制,它会有多可靠。 (希望一切都能正确重新创建……但是,我不了解 Android。)如果您只想使用 onCreate 中的活动,我会将变量设为本地变量。
  • 就性能而言,实际上并没有太大区别。所以除非你真的想尽可能地减少内存/cpu,否则只需调用 getActivity()。它更具可读性。

标签: android performance memory field cpu


【解决方案1】:

但我认为调用 getActivity 需要一些 CPU 处理。

它比你想象的要少。 getActivity 只是访问一个字段,获取 Activity。它没有太多的CPU参与。您的第二种方法需要一点内存,首先需要一点堆栈,see this 以提高性能。

另一方面。这是premature optimization.,如果您在当前代码中没有任何内存问题。

【讨论】:

  • 我使用选项 I 更好,请参阅编辑...谢谢
【解决方案2】:

嗯,查看Android源代码我可以找到Fragment类中getActivity()方法的来源:

final public FragmentActivity getActivity() {
    return mActivity;
}

所以,如您所见,在 Option II 中 mActivity 被保留了两次,这很浪费内存,所以从现在开始我将使用 Option I。

感谢您的回答,他们让我明白了这一点:)

【讨论】:

  • mActivity 不会被保留两次。当您在 optionII mActivity = getActivity(); 中设置时,您只是在设置参考。您的活动实例仅存在于内存中的 1 个位置,mActivity 只是指向内存中的那个位置。如果您有两个活动实例,这甚至没有意义。
【解决方案3】:

第二个选项更好。您只会使用一次 getActivity()。在第一个选项中,您将多次调用它,这很昂贵。声明 mActivity 会消耗一些内存。由于 mActivity 并不是真正的对象,而是对对象的引用,所以它不会占用那么多内存。

【讨论】:

  • 我使用选项 I 更好,请参阅编辑...谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
相关资源
最近更新 更多