2

为了让这个问题保持简单,考虑一个场景,我正在创建一个 Android Activity,它只是从外部源读取数据并在 TextView 中使用该数据。我在以下两种情况下看到了巨大的性能差异:

  1. 读取外部数据并填充 Activity 的实例变量以在整个 Activity 中使用。执行时间为 2220.479170 毫秒,DalvikVM 释放内存 12 次。
  2. 每次需要在类方法中使用外部数据时,将其读入局部变量。结果为 1150.434916 毫秒,DalvikVM 释放内存 6 次。

如您所见,使用实例变量的执行时间比使用局部变量多 1070 毫秒,并且内存泄漏量增加了一倍。我从使用局部变量切换到实例变量的原因是因为我在不同的方法中使用相同的数据,因此使用实例变量比使用多个局部变量更有意义。

我的问题是为什么使用局部变量而不是实例变量时性能更高效,为什么内存需要释放两倍的次数?

一段代码:

public class DataActivity extends Activity {

    //Raw value table entries
    //Table 61
    private int nbr_chns_set1;
    private int nbr_blks_set1;
    private int nbr_blk_ints_set1;
    private int max_int_time_set1;
    //Table 62
    private int blk_end_read_flag;
    private int blk_end_pulse_flag;   
    //Table 63
    private int last_block_element;
    private int nbr_valid_int;
    private int nbr_valid_blocks;
    private int interval_order;
    //Table 64
    ArrayList<String> table64Entries;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lp_data);

        initializeVariables();
        classMethods();     
    }

    public void initializeVariables() {

        //Populate class variables from values in Table 61
        TableReader tableReader = new TableReader(this, R.raw.table61);
        ArrayList<String> table61Entries = tableReader.readTable();
        nbr_chns_set1 = table61Entries.get(98);
        nbr_blks_set1 = table61Entries.get(90);
        nbr_blk_ints_set1 = table61Entries.get(94);
        max_int_time_set1 = table61Entries.get(102);
        blk_end_read_flag = table61Entries.get(22);
        blk_end_pulse_flag = table61Entries.get(26);

        //Populate class variables from values in Table 63
        tableReader = new TableReader(this, R.raw.table63);
        ArrayList<String> table63Entries = tableReader.readTable();
        last_block_element = table63Entries.get(38);
        nbr_valid_int = table63Entries.get(5));
        nbr_valid_blocks = table63Entries.get(34);
        interval_order = table63Entries.get(22);

        //Populate class variables from values in Table 64
        tableReader = new TableReader(this, R.raw.table64);
        table64Entries = tableReader.readTable();

    }

    public void classMethods() {
        ...
    }
4

1 回答 1

2

局部原始变量在堆栈上。它的范围是本地的。如果您在方法中有变量,并且当该方法起作用时,堆栈指针将被重置。

实例变量存储在堆上。Android 做垃圾收集我的标记和扫描。当类本身可用于垃圾回收时,实例变量可用于垃圾回收。

http://www.youtube.com/watch?v=_CruQY55HOk。谈话是关于内存管理的。

http://developer.android.com/training/articles/perf-tips.html

于 2013-04-01T15:29:57.703 回答