我正在尝试通过某种内部方法获得尽可能多的性能。
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),我得到以下更合理的结果:
公共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