2013-09-06 11 views
5

यह Java method धीमी गति से गणना का अनुकरण के लिए मानदंड में इस्तेमाल किया जाता है:इस विधि को अनुकूलित क्यों नहीं किया जाता है?

static int slowItDown() { 
    int result = 0; 
    for (int i = 1; i <= 1000; i++) { 
     result += i; 
    } 
    return result; 
} 

यह IMHO एक बहुत बुरा विचार है, के रूप में अपने शरीर return 500500 द्वारा प्रतिस्थापित कर सकते हैं। ऐसा कभी नहीं होता है; शायद अमेरिकी स्काईट के रूप में वास्तविक कोड के लिए अप्रासंगिक होने के कारण इस तरह के अनुकूलन की वजह से अप्रासंगिक है।

दिलचस्प बात यह है result += 1; साथ एक से थोड़ा सरल तरीका पूरी तरह से दूर हो जाता है अनुकूलित (कैलिपर ०.४६०५४३ एनएस रिपोर्ट)।

लेकिन फिर भी जब हम सहमत हैं कि दूर एक निरंतर परिणाम लौटने के तरीकों के अनुकूलन वास्तविक कोड के लिए बेकार है, वहां अभी भी पाश unrolling, जो

static int slowItDown() { 
    int result = 0; 
    for (int i = 1; i <= 1000; i += 2) { 
     result += 2 * i + 1; 
    } 
    return result; 
} 

की तरह कुछ करने के लिए ले जा सकता है है तो मेरे सवाल बनी हुई है: क्यों नहीं अनुकूलन है यहाँ प्रदर्शन किया?

क्या मैं मूल रूप से लिखा था के विपरीत; मैंने कुछ ऐसा देखा होगा जो वहां नहीं था।

+1

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

+0

क्या यह वास्तविक कोड है? यदि आप जानते हैं कि इसका क्या मतलब है, तो इस तरह कोड क्यों न लिखें? मैं संतुष्ट हूं कि जेआईटी कंपाइलर्स को वास्तविक कोड में ऑप्टिमाइज़ करने के बजाय * वास्तविक * कोड को अनुकूलित करने के लिए ट्यून किया गया है जो वास्तविकता में नहीं होगा। (स्टेटिक अनुकूलक * इस से थोड़ा अधिक छूट है, लेकिन याद रखें कि हर अनुकूलन एक JIT कम्पाइलर खोजने की कोशिश करता निष्पादन समय में एक लागत है।) –

+0

@JonSkeet:, शर्मनाक मैं निरीक्षण, उस लिंक अमरूद बेंच मार्किंग कोड, पर ले जाए, जो मैं आमतौर पर विश्वास करने की उम्मीद करता हूं ... –

उत्तर

3

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

यह सही है कि इस तरह के एक कोड वास्तविक कोड में प्रकट नहीं होता। हालांकि यह अन्य हॉटस्पॉट्स के कई इनलाइनिंग ऑपरेशंस के बाद बना सकता है जो मानते हैं कि संकलन-समय स्थिरांक नहीं है लेकिन रनटाइम स्थिरांक या डी-फैक्टो स्थिरांक (मूल्य जो सिद्धांत में बदल सकते हैं लेकिन व्यावहारिक रूप से नहीं)। जब कोड का ऐसा टुकड़ा बनी रहती है तो इसे पूरी तरह से अनुकूलित करने के लिए यह एक बड़ा लाभ है, लेकिन जल्द ही ऐसा होने की उम्मीद नहीं है, यानी मुख्य विधि से सही कॉल करते समय।

अद्यतन: मैं कोड को सरल बनाया और अनुकूलन पहले भी आया था।

public static void main(String[] args) { 
    final int inner=10; 
    final float innerFrac=1f/inner; 
    int count=0; 
    for(int j=0; j<Integer.MAX_VALUE; j++) { 
    long t0=System.nanoTime(); 
    for(int i=0; i<inner; i++) slowItDown(); 
    long t1=System.nanoTime(); 
    count+=inner; 
    final float dt = (t1-t0)*innerFrac; 
    System.out.printf("execution time: %.0f ns%n", dt); 
    if(dt<10) break; 
    } 
    System.out.println("after "+count+" invocations"); 
    System.out.println(System.getProperty("java.version")); 
    System.out.println(System.getProperty("java.vm.version")); 
} 
static int slowItDown() { 
    int result = 0; 
    for (int i = 1; i <= 1000; i++) { 
     result += i; 
    } 
    return result; 
} 

...

execution time: 0 ns 
after 15300 invocations 
1.7.0_13 
23.7-b01 

(64Bit सर्वर वीएम)

+0

क्या आप कृपया कोड पोस्ट कर सकते हैं? मुझे उत्सुकता है कि यह कैसे हुआ कि यह सब अनुकूलित हो गया - मैंने लिखा था कि मैंने सोचा कि यह मेरे साथ भी हुआ है, लेकिन अब मुझे लगता है कि मैं कुछ नहीं देख रहा था जो वहां नहीं था। – maaartinus

+0

ऐसा लगता है कि विधि को ऑप्टिमाइज़ किए गए * दूर * अनुकूलित किया गया है (यानी, निरंतर स्थिर)। मैंने कुछ कोशिश की जैसे 'x + = slowItDown()' और अंत में 'x' प्रिंट करें और समय 300 एनएस से कम नहीं हुआ। यह आपके द्वारा लिखे गए कार्यों से मेल खाता है; यह सिर्फ इतना है कि मैं तहखाने के बारे में अधिक उत्सुक था (क्योंकि यह उस बेंचमार्क को नष्ट कर देगा जिसे मैंने विधि से लिया था)। – maaartinus

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