Я намагаюся отримати якомога більше продуктивності від якогось внутрішнього методу.
Код 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