我试图从一些内部方法中尽可能地获得性能。
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%的CPU时间花费在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)I throws java/io/IOException L0 LINENUMBER 77 L0 ILOAD 1 ICONST_4 IREM ISTORE 2 L1 LINENUMBER 78 L
因此这更加合乎逻辑。
javac
不会生成这个。 - apanginopenjdk version "11.0.6" 2020-01-14
。 - Rob Audenaerde