일부 내부 방법에서 최대한 많은 성능을 얻으려고합니다.
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
어쨌든 할 수없는 프리미티브에 대해 작업 하므로 컴파일러가 왜이 줄을 생성합니까? 버그입니까? 아니면 '정상적인'행동?
(비트 마스크로 해결할 수도 있지만 궁금합니다.)
[최신 정보]
운영자는 관련이없는 것 같습니다 (아래 답변 참조).
이클립스 컴파일러 (버전 4.10)를 사용하면 이보다 합리적인 결과를 얻습니다.
공개 getParent (I) java / io / IOException 발생 L0 줄 번호 77 L0 ILOAD 1 아이콘 IREM 아이 스토어 2 L1 줄 번호 78 L
더 논리적입니다.
javac
은 이것을 생성하지 않습니다.
openjdk version "11.0.6" 2020-01-14
우분투 64 비트에서 java 11을 사용하여 Intellij 2019.3에서 컴파일됩니다 .
INVOKESTATIC