По крайней мере для стандартной Java есть небольшая небольшая разница.
Я немного изменил ваш пример так:
public class test {
private Object[] _obj;
protected void myMethodLocal() {
Object[] obj = _obj;
// Is there an appreciable differnce between
for(int i = 0; i < obj.length; i++) {
// do stuff
}
}
protected void myMethodMember() {
// and this?
for(int i = 0; i < this._obj.length; i++) {
// do stuff
}
}
}
Так что myMethodLocal()
будет кешировать _obj
в локальную переменную, в то время как myMethodMember()
использует член класса _obj
.
Теперь, давайте декомпилируем это (используя javap ):
protected void myMethodLocal();
Code:
0: aload_0
1: getfield #2; //Field _obj:[Ljava/lang/Object;
4: astore_1
5: iconst_0
6: istore_2
7: iload_2
8: aload_1
9: arraylength
10: if_icmpge 19
13: iinc 2, 1
16: goto 7
19: return
protected void myMethodMember();
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: getfield #2; //Field _obj:[Ljava/lang/Object;
7: arraylength
8: if_icmpge 17
11: iinc 1, 1
14: goto 2
17: return
Без переходав деталях, последний пример должен обращаться к полю _obj
при каждой итерации цикла, в то время как в первом примере он уже кэшируется в локальной ссылке и ему просто необходим доступ к локальной ссылке.
Что это означаетв разнице в скорости?
Не очень.
В то время как разница между доступом к локальной ссылке и ссылкой на класс означает намного больше в таком языке, как Python, для Java вам действительно не нужно беспокоиться.Гораздо важнее, чтобы ваш код читался и обслуживался, чем беспокоиться о таких деталях.
(Кроме того, приведенный выше байт-код в любом случае не учитывает, что может делать JIT-компилятор).
Если вы получите поле экземпляра с помощью функции , например, getObj()
, я вставлю это в переменную, чтобы вам не нужно было каждый раз вызывать getObj()
хотите использовать одно и то же поле.
Кроме того, просто как небольшую заметку, вы, вероятно, должны назвать свой класс Test
вместо test.
Java имеет тенденцию отдавать предпочтение Upper Camel Case для имен классов.