Cache Field Lookups
Accessing object fields is much slower than accessing local variables.
Instead of writing:
for (int i = 0; i < this.mCount; i++)
dumpItem(this.mItems[i]);
You should write:
int count = this.mCount;
Item[] items = this.mItems;
for (int i = 0; i < count; i++)
dumpItems(items[i]);
(We're using an explicit "this" to make it clear that these are
member variables.)
A similar guideline is never call a method in the second clause of a "for"
statement. For example, the following code will execute the getCount() method
once per iteration, which is a huge waste when you could have simply cached
the value as an int:
for (int i = 0; i < this.getCount(); i++)
dumpItems(this.getItem(i));
It's also usually a good idea to create a local variable if you're going to be
accessing an instance field more than once. For example:
protected void drawHorizontalScrollBar(Canvas canvas, int width, int height) {
if (isHorizontalScrollBarEnabled()) {
int size = mScrollBar.getSize(false);
if (size <= 0) {
size = mScrollBarSize;
}
mScrollBar.setBounds(0, height - size, width, height);
mScrollBar.setParams(
computeHorizontalScrollRange(),
computeHorizontalScrollOffset(),
computeHorizontalScrollExtent(), false);
mScrollBar.draw(canvas);
}
}
That's four separate lookups of the member field mScrollBar
.
By caching mScrollBar in a local stack variable, the four member field lookups
become four stack variable references, which are much more efficient.
Incidentally, method arguments have the same performance characteristics
as local variables.