Я пытаюсь получить как можно больше производительности от какого-то внутреннего метода.
Java-код:
List<DirectoryTaxonomyWriter> writers = Lists.newArrayList();
private final int taxos = 4;
[...]
@Override
public int getParent(final int globalOrdinal) throws IOException {
final int bin = globalOrdinal % this.taxos;
final int ordinalInBin = globalOrdinal / this.taxos;
return this.writers.get(bin).getParent(ordinalInBin) * this.taxos + bin; //global parent
}
В своем профилировщике я увидел, что процессор загружается на 1% java.util.Objects.requireNonNull
, но я даже этого не называю. При проверке байт-кода я увидел это:
public getParent(I)I throws java/io/IOException
L0
LINENUMBER 70 L0
ILOAD 1
ALOAD 0
INVOKESTATIC java/util/Objects.requireNonNull (Ljava/lang/Object;)Ljava/lang/Object;
POP
BIPUSH 8
IREM
ISTORE 2
Таким образом, компилятор генерирует эту (бесполезную?) Проверку. Я работаю с примитивами, которые не могут быть в null
любом случае, так почему компилятор генерирует эту строку? Это ошибка? Или «нормальное» поведение?
(Я могу обойтись с битовой маской, но мне просто любопытно)
[ОБНОВИТЬ]
Оператор, похоже, не имеет к этому никакого отношения (см. Ответ ниже)
Используя компилятор eclipse (версия 4.10), я получаю более разумный результат:
public getParent (I) Я бросаю Java / IO / IOException L0 ЛИНИУМЕР 77 L0 ILOAD 1 ICONST_4 IREM ISTORE 2 L1 ЛЕНЕНУМЕР 78 Л
Так что это более логично.
javac
не генерирует это.
openjdk version "11.0.6" 2020-01-14
на Ubuntu 64 бит.
INVOKESTATIC