मैं कुछ आंतरिक विधि से अधिक से अधिक प्रदर्शन प्राप्त करने की कोशिश कर रहा हूं।
जावा कोड है:
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) का उपयोग करके मुझे यह अधिक उचित परिणाम मिलता है:
public getParent (I) I java / io / IOException फेंकता है L0 LINENUMBER 77 एल 0 ILOAD 1 ICONST_4 IREM ISTORE 2 एल 1 LINENUMBER 78 एल
तो यह अधिक तार्किक है।
javac
यह उत्पन्न नहीं करता है।
openjdk version "11.0.6" 2020-01-14
ubuntu 64 बिट पर।
INVOKESTATIC