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

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

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

Я немного озадачен комментарием «избегайте кода getfield»

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

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

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

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

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

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

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

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

Давайте будем гением компьютера.