【发布时间】:2020-05-19 08:16:10
【问题描述】:
我正在尝试通过某种内部方法获得尽可能多的性能。
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 有 1% 的 CPU 开销,但我什至不这么认为。在检查字节码时,我看到了:
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 版)我得到了这个更合理的结果:
所以这更合乎逻辑。
【问题讨论】:
-
@Lino 当然,但这与第 70 行并不真正相关,原因是
INVOKESTATIC -
你使用什么编译器?普通
javac不会生成这个。 -
你使用什么编译器? Java版本,Openjdk/Oracle/等?编辑:哎呀,@apangin 更快,抱歉
-
从 Intellij 2019.3 编译,在 ubuntu 64 位上使用 java 11,
openjdk version "11.0.6" 2020-01-14。
标签: java performance modulo primitive-types null-check