1

我正在阅读谷歌的记事本教程,在练习二中发现:

“我们在方法开始时将 mNotesCursor 字段分配给局部变量。这是作为 Android 代码的优化完成的。访问局部变量比访问 Dalvik VM 中的字段更有效,所以通过这样做我们只对字段进行一次访问,对局部变量进行五次访问,使例程更加高效。建议您尽可能使用此优化。

编码:

Cursor c = mNotesCursor;
c.moveToPosition(position);
Intent i = new Intent(this, NoteEdit.class);
i.putExtra(NotesDbAdapter.KEY_ROWID, id);
i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
i.putExtra(NotesDbAdapter.KEY_BODY, c.getString(c.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
startActivityForResult(i, ACTIVITY_EDIT);

为什么访问局部变量而不是字段更快?

记事本教程可在以下网址访问:http: //developer.android.com/training/notepad/notepad-ex2.html 这部分在第 5 步中。

4

1 回答 1

2

根据 Dianne Hackborn(Android 框架工程师)的说法:“当访问成员变量时,编译器经常需要取消引用 'this' 并在每次访问时从内存中重新加载值,因为自上次访问以来该值可能已更改使用。相比之下,访问局部变量可以通过使用寄存器中的现有值来完成。请参阅:链接

但是,过度使用似乎会违背其他 Android 性能提示,例如避免创建不必要的对象。链接。此外,在那篇文章的后面,关于内部 Getter 的使用它说:“没有 JIT,直接字段访问比调用普通 getter 快大约 3 倍。使用 JIT(直接字段访问与访问本地一样便宜),直接字段访问比调用普通的 getter 快大约 7 倍。”

于 2013-05-01T01:13:09.783 回答