Я намагаюся отримати якомога більше продуктивності від якогось внутрішнього методу.
Код 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
LINENUMBER 77 L0
ІЛОАД 1
ICONST_4
ІРЕМ
ISTORE 2
L1
LINENUMBER 78 L
Тож це більш логічно.
javacне створює цього.
openjdk version "11.0.6" 2020-01-14на ubuntu 64 біт.
INVOKESTATIC