2011-01-21 6 views
28

बचना जावा के स्ट्रिंग कक्षा में, ट्रिम विधि इस में शामिल हैं:getfield opcode

int off = offset;  /* avoid getfield opcode */ 
char[] val = value; /* avoid getfield opcode */ 

मैं थोड़ा टिप्पणी हैरान "getfield opcode से बचने" ...

क्या इसका क्या मतलब? (मैं इसे इस बाईटकोड में getfield से दूर रहता है ले लेकिन क्यों यह एक अच्छी बात है [TM]? है)

यह मामला में ऑब्जेक्ट निर्माण को रोकने के लिए ट्रिम कुछ नहीं करता है (और इसलिए यह वापस किया गया है) या?

उत्तर

20

मेरे अनुमान उस बिंदु स्थानीय चर में एक बार मान कॉपी करने के लिए, अगले कुछ लाइनों में पाश के प्रत्येक यात्रा के लिए ढेर से बार-बार क्षेत्र मूल्य लाने के लिए होने से बचाने के है।

बेशक, यह सवाल पूछता है कि क्यों "लैन" स्थानीय चर पर एक ही टिप्पणी लागू नहीं की गई है। (मैं यह भी उम्मीद करता हूं कि जेआईटी वैसे भी रीफ्रैचिंग से बचने के लिए, विशेष रूप से चर अंतिम हैं।)

+7

टिप्पणी 'लेन' पर लागू नहीं होती है क्योंकि लेन को विधि में सक्रिय रूप से संशोधित किया जाता है, इसलिए इसे किसी भी स्थानीय चर के रूप में जाना होता था। दूसरी तरफ 'ऑफ' और 'वैल' संशोधित नहीं हैं, लेकिन पूरी तरह अनुकूलन के लिए मौजूद हैं। – Lars

+0

@ लार्स: अच्छी तरह से देखा गया; मैंने लेन में बदलाव नहीं देखा था। –

+0

@ जोन्सस्केट यदि आप व्यक्तिगत रूप से इस पुस्तकालय को लिख रहे थे, तो क्या आप उम्मीद करते हैं कि आप यह कर चुके होंगे? या बस जेआईटी पर माइक्रो-ऑप्टिज़ पर भरोसा किया? – corsiKa

11

getfield का उपयोग कक्षा के सदस्य चर को प्राप्त करने के लिए किया जाता है।

आप शेष कोड से देख सकते हैं:

while ((st < len) && (val[off + st] <= ' ')) { 
    st++; 
} 
while ((st < len) && (val[off + len - 1] <= ' ')) { 
    len--; 
} 

तो जब आप एक पाश में कर रहे हैं, यह getfield हर बार जब आप संदर्भ value या offset निष्पादित करने के लिए है। यदि लूप लंबे समय तक चलता है तो आप एक बड़ी प्रदर्शन-हिट कर सकते हैं (क्योंकि प्रत्येक बार लूप-हालत का परीक्षण किया जाता है, getfieldoffset और value दोनों के लिए निकाला जाता है)। तो स्थानीय चर off और val का उपयोग करके, आप प्रदर्शन हिट को कम करते हैं।

+0

सहमत है, इसके अलावा यह केवल गैर-अनुकूलित कोड के लिए मान्य है। जब जेआईटी शामिल हो जाता है, तो इससे कोई फर्क नहीं पड़ता। जेआईटी शायद एक रजिस्टर में मूल्य डालकर अनुकूलन करता है; यह पूरी तरह से बराबर है क्योंकि यह पूरी तरह से बराबर है। मूल्य अंतिम होने के साथ, यह स्पष्ट है। लेकिन इसके बिना भी संभव होगा। – maaartinus

+6

जेआईटी * * इसे अनुकूलित कर सकता है। उदाहरण के लिए, Dalvik पर इस अनुकूलन की उम्मीद नहीं है। किसी क्षेत्र में एक क्षेत्र को खींचना अन्य कारणों से उपयोगी हो सकता है, जैसे कि उस क्षेत्र के लिए शून्य जांच, जिसे समवर्ती रूप से एक्सेस किया जा सकता है। – NateS

संबंधित मुद्दे