मुझे लगता है कि आप सेब और संतरे की तुलना कर रहे। प्रदर्शन मिथक संदर्भ फ़ील्ड एक्सेस के लिए एक जेआईटी के लाभ पर चर्चा करता है, जबकि दूसरा संदर्भ विधि पहुंच के लिए एक जेआईटी के लाभ पर चर्चा करता है।
: -
मैं यह समझ के रूप में, स्थानीय उपयोग बनाम प्रत्यक्ष क्षेत्र पहुँच के लिए एक सादृश्य (स्थानीय नहीं क्षेत्र पहुँच के रूप में आप अपनी पोस्ट में लिखा था कि वहाँ एक स्थानीय क्षेत्र के रूप में ऐसी कोई बात नहीं है) निम्नलिखित है
class foo {
int bar = 42;
int doStuff(){
int x = 1;
x += bar;
x += bar;
x += bar;
return x;
}
}
प्रत्येक संदर्भ bar
लिए एक संबद्ध प्रदर्शन लागत है। एक अच्छा संकलक जैसे अनुकूलन और 'फिर से लिखने के' कोड के लिए अवसर की पहचान करेगा:
int doStuff(){
int x = 1f;
int local_bar = bar;
x += local_bar;
x += local_bar;
x += local_bar;
return x;
}
एक JIT बिना, इस एक आसान अनुकूलन है, जो आप प्रदर्शन में एक 20% टक्कर हो जाता है।
एक जेआईटी के साथ, अनुकूलन अपरिहार्य है, क्योंकि जेआईटी पहली जगह में bar
तक पहुंच से प्रदर्शन हिट को हटा देता है।
दूसरा संदर्भ का वर्णन करता है इस परिदृश्य पर:
class foo {
int bar = 42;
int getBar() { return bar; }
int doStuff(){
int x = 1;
x += getBar();
x += getBar();
x += getBar();
return x;
}
}
प्रत्येक समारोह कॉल एक संबद्ध प्रदर्शन दंड है। एक कंपाइलर नहीं एकाधिक getBar()
विधि कॉल को कैश कर सकता है (क्योंकि यह पिछले प्रत्यक्ष क्षेत्र में bar
तक पहुंचता है), क्योंकि getBar() प्रत्येक बार इसे कॉल करने पर एक पूरी तरह से अलग संख्या लौटा सकता है (यानी यदि उसके पास इसके वापसी मूल्य के लिए यादृच्छिक या समय-आधारित घटक)। इसलिए, यह तीन विधि कॉल पर अमल करना होगा।
यह समझना महत्वपूर्ण है कि उपर्युक्त फ़ंक्शन लगभग एक ही गति के साथ या बिना किसी गति के निष्पादित करेगा।
यदि आप उपरोक्त फ़ंक्शन में के साथ मैन्युअल रूप से getBar()
को प्रतिस्थापित करना चाहते हैं, तो आप प्रदर्शन को बढ़ावा देंगे।एक जेआईटी के बिना मशीन पर, यह प्रदर्शन बूस्ट लगभग 3x है, क्योंकि क्षेत्र का उपयोग अभी भी कुछ हद तक धीमा है, इसलिए धीमी गति से पहुंचने वाले बहुत धीमे तरीकों को बदलने से बहुत ही धीमी गति से केवल मध्यम वृद्धि होती है। एक जेआईटी के साथ, हालांकि, क्षेत्र का उपयोग तेजी से होता है, इसलिए तेज क्षेत्र की पहुंच के साथ बहुत धीमी विधियों को प्रतिस्थापित करने से बहुत अधिक (7x) बढ़ावा मिलता है।
मुझे आशा है कि यह समझ में आता है!
मैं हाँ कहूंगा, दस्तावेज गलत/गलत/बहुत अलग मापों के आधार पर है। यदि आईएमओ सचमुच लिया जाता है तो यह वास्तव में बताता है कि जेआईटी 20% और 133% (3x बनाम 7x) तक फ़ील्ड एक्सेस को गति देता है, जो असंभव है – zapl
बिल्कुल, यह मेरा मुद्दा है। मैं सोच रहा हूं कि कौन से मूल्य सही हैं। – pawelzieba
दोनों कथन 20% और [MethodInvocationBenchmark.java] के लिए विभिन्न मानक [FieldAccessBenchmark.java] (http://code.google.com/p/dalvik/source/browse/trunk/benchmarks/FieldAccessBenchmark.java) पर आधारित हैं। (http://code.google.com/p/dalvik/source/browse/trunk/benchmarks/MethodInvocationBenchmark.java) 133% के लिए। एक कारण हो सकता है। लेकिन मुझे बहुत ज्यादा परवाह नहीं है, केवल सभी उपकरणों के <5% ([<एंड्रॉइड 2.2] (http://developer.android.com/about/dashboards/index.html)) में JIT और महत्वपूर्ण सबक नहीं है क्या आंतरिक गेटर्स धीमे हैं। – zapl