2016-02-15 13 views
8

मेरे पास एक थ्रेड निष्पादक कार्यान्वयन है जहां एक रैपर की लागत बहुत महंगा दिखाई दे रही है। एक रैपर वर्ग कार्य है जिसे निम्नानुसार परिभाषित किया गया है:जावा विधि कॉल इतना महंगा क्यों है?

class Task { 
    public Runnable r;  
    public Task(Runnable r) {   
    this.r = r;                 
    } 

    public void run() {  
    r.run();  
    }  

List<task> taskList; 

निम्नलिखित समय के लिए रन टाइम ~ 800ms है।

for (Task t : taskList) {             
      t.r.run();     
    } 

जबकि निम्न मामले में यह ~ 7000ms है।

for (Task t : taskList) {   
      t.run();                
} 

यह अलगाव में नहीं होता है, लेकिन निष्पादक के कोड के अंदर हो रहा है। बस सोच रहा है कि क्या किसी के पास संकेत है कि क्या हो रहा है?

runnable पारित किया जा रहा इस परीक्षण मामले के लिए निम्नलिखित है:

class Tester implements Runnable {             
    int i;                   

    public Tester(int i) {               
    this.i = i;                  
    }                     

    @Override                   
    public void run() {                
    //System.out.println(i);              
    for (int j = 0; j < 1000000; j++) {            
     i = j;                  
    }                    
    }                     

    public int getI() {                
    return i;                  
    } 

संदर्भ के लिए, कोड github.com/sharvanath/TempThreadPool पर पाया जा सकता। निष्पादन का परिणाम प्राप्त करने के लिए थ्रेडपूलटेस्ट चलाएं। अब ThreadPool.java की लाइन 41 बदलने का प्रयास करें और जादू देखें।

+0

'रन' क्या करता है? क्या यह नो-ऑप है? – 5gon12eder

+1

आपके द्वारा यहां पोस्ट किए गए कोड के लिए (लगभग शून्य) अंतर होना चाहिए। अन्य कोड में कुछ होना चाहिए। –

+5

आपको पूरा कोड साझा नहीं करना चाहिए - आपको एक * न्यूनतम * उदाहरण शामिल करना चाहिए जो समस्या को प्रदर्शित करता है। –

उत्तर

1

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

इसे पढ़ने का एक अच्छा बिंदु पढ़ना है यह विषय - How do I write a correct micro-benchmark in Java?

मैं आपको सलाह देता हूं कि आप इस तरह के परीक्षणों के लिए जेएमएच ढांचे का उपयोग करें, जिसमें पहले से ही इसके स्रोत कोड में इसके उपयोग के बहुत सारे उदाहरण हैं।

+0

यदि आप एक लिंक प्रदान करते हैं, कृपया लिंक को तोड़ने के बाद प्रासंगिक भागों पर कॉपी करें। –

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