Подтвердить что ты не робот

Избегание кода операции getfield

В классе Java String метод trim содержит следующее:

int off = offset;      /* avoid getfield opcode */
char[] val = value;    /* avoid getfield opcode */

Я немного озадачен комментарием "избегайте getfield opcode"...

Что это значит? (Я полагаю, это позволяет избежать использования getfield в байт-коде, но почему это хорошая вещь [TM]?)

Следует ли предотвратить создание объекта в случае, если обрезка ничего не делает (и, следовательно, это возвращается) или?

4b9b3361

Ответ 1

Моя догадка заключается в том, что нужно скопировать значения в локальные переменные один раз, чтобы избежать необходимости повторного извлечения значения поля из кучи для каждой итерации цикла в следующих нескольких строках.

Конечно, это задает вопрос о том, почему тот же комментарий не был применен к локальной переменной "len". (Я бы также ожидал, что JIT избежит повторного набора, особенно, поскольку переменные являются окончательными.)

Ответ 2

getfield используется для получения переменной-члена класса.

Как вы можете видеть из оставшегося кода:

while ((st < len) && (val[off + st] <= ' ')) {
    st++;
}
while ((st < len) && (val[off + len - 1] <= ' ')) {
    len--;
}

Итак, когда вы находитесь в цикле, он должен выполнять getfield каждый раз, когда вы ссылаетесь на value или offset. Вы можете понести большой удар производительности, если цикл работает в течение длительного времени (поскольку каждый раз, когда выполняется условие цикла, getfield используется как offset и value). Поэтому, используя локальные переменные off и val, вы уменьшаете производительность.