Android - Activity的局部变量与实例变量的性能

时间:2013-04-01 15:00:09

标签: android performance memory-leaks instance-variables local-variables

为了简化这个问题,请考虑我正在创建一个Android Activity的场景,它只是从外部源读取数据并在TextView中使用该数据。我发现以下两种情况存在显着的性能差异:

  1. 读取外部数据并填充Activity的实例变量以在整个Activity中使用。结果执行时间为2220.479170 ms,DalvikVM释放内存12次。
  2. 每次需要在类方法中使用时,将外部数据读入局部变量。结果为1150.434916 ms,DalvikVM释放内存6次。
  3. 正如您所看到的,使用实例变量执行的时间比使用局部变量要长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() {
            ...
        }
    

1 个答案:

答案 0 :(得分:2)

本地原始变量在堆栈中。它的范围是本地的。如果方法中有变量,并且方法完成它的工作,则重置堆栈指针。

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

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

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