为了简化这个问题,请考虑我正在创建一个Android Activity的场景,它只是从外部源读取数据并在TextView中使用该数据。我发现以下两种情况存在显着的性能差异:
正如您所看到的,使用实例变量执行的时间比使用局部变量要长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() {
...
}
答案 0 :(得分:2)
本地原始变量在堆栈中。它的范围是本地的。如果方法中有变量,并且方法完成它的工作,则重置堆栈指针。
实例变量存储在堆上。 Android做垃圾收集我的标记和扫描。当类本身可用于垃圾收集时,实例变量可用于垃圾收集。
http://www.youtube.com/watch?v=_CruQY55HOk。谈话是关于记忆管理。
http://developer.android.com/training/articles/perf-tips.html。