私はいくつかの内部メソッドから可能な限り多くのパフォーマンスを得ようとしています。
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
}
プロファイラーでjava.util.Objects.requireNonNull
、にCPU使用率が1%あるのを見ましたが、それを呼び出すことすらしません。バイトコードを検査するとき、私はこれを見ました:
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)I java / io / IOExceptionをスローします L0 LINENUMBER 77 L0 ILOAD 1 ICONST_4 IREM ISTORE 2 L1 LINENUMBER 78 L
つまり、それはより論理的です。
javac
はこれを生成しません。
openjdk version "11.0.6" 2020-01-14
ubuntu 64ビットでコンパイルされています。
INVOKESTATIC