Избегание кода операции getfield
В классе Java String метод trim содержит следующее:
int off = offset; /* avoid getfield opcode */
char[] val = value; /* avoid getfield opcode */
Я немного озадачен комментарием "избегайте getfield opcode"...
Что это значит? (Я полагаю, это позволяет избежать использования getfield в байт-коде, но почему это хорошая вещь [TM]?)
Следует ли предотвратить создание объекта в случае, если обрезка ничего не делает (и, следовательно, это возвращается) или?
Ответы
Ответ 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
, вы уменьшаете производительность.