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