为了让这个问题保持简单,考虑一个场景,我正在创建一个 Android Activity,它只是从外部源读取数据并在 TextView 中使用该数据。我在以下两种情况下看到了巨大的性能差异:
- 读取外部数据并填充 Activity 的实例变量以在整个 Activity 中使用。执行时间为 2220.479170 毫秒,DalvikVM 释放内存 12 次。
- 每次需要在类方法中使用外部数据时,将其读入局部变量。结果为 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() {
...
}