2015-10-02 14 views
8

मैं परीक्षण करने के लिए कितना समय लगता जावा के लिए ले जाता है 0 से एक बड़ी संख्या के लिए गिनती के सरल कार्य करने के लिए निम्नलिखित कोड लिखा है:जावा के व्यवहार

public static void main(String[] args) 
{ 
    for(long k = 0 ; k <= 1000000000000000000L /* 18 zeros */ ; k++) 
     ; 
    System.out.println("Finished"); 
} 

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

लेकिन उपरोक्त कोड को समाप्त करने के लिए जितना समय लगता है, निम्नलिखित कोड को आजमाने के बाद, मैंने अप्रत्याशित रूप से देखा कि संदेश समाप्त होने के बाद एक दूसरे के अंश में "समाप्त" संदेश मुद्रित किया गया था!

public static void main(String[] args) 
{ 
    int j; 
    for(int i = 0 ; i <= 1000000000 /* 9 zeros */ ; i++) 
     for(j = 0 ; j <= 1000000000 /* 9 zeros */ ; j++) 
      ; 
    System.out.println("Finished"); 
} 

कोड के इन दो टुकड़ों के साथ जावा के व्यवहार में क्या अंतर है? इंट संख्याओं के साथ जावा के व्यवहार के बीच वास्तव में कुछ अंतर होना चाहिए, और int के अलावा पूर्णांक प्रकारों के साथ इसका व्यवहार होना चाहिए।

+0

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

+0

एसओ में पहले से ही एक ही सवाल है, लेकिन वहां कोई अच्छा जवाब नहीं दिया गया था। – user3437460

उत्तर

0

असल में मुझे लगता है कि यह संकलक की संकलक अनुकूलन तकनीक है। मुझे नहीं लगता कि यह "जावा व्यवहार" है, यह एक विशिष्ट जावा कंपाइलर का व्यवहार है जिसके बारे में हम बात कर रहे हैं।

जावा के स्वयं के व्यवहार जावा भाषा विशिष्टता में निर्दिष्ट किया गया था और for-loop specification या तो int या long प्रकार चर के अनुकूलन निर्दिष्ट नहीं है।

वर्तमान "आधिकारिक" कंपाइलर के लिए, यह भविष्य में long वृद्धिशील चर के प्रकार को अनुकूलित या नहीं कर सकता है।

-------------------------------- अनुकूलन प्रयोग

मैं निम्नलिखित दो कार्यक्रमों भाग गया:

कार्यक्रम 1 (हमेशा के लिए चलाता है):

public static void main(String[] args) 
    { 
     long counter = 0L; 
     int j; 
     for(int i = 0 ; i <= 1000000000 /* 9 zeros */ ; i++) 
      for(j = 0 ; j <= 1000000000 /* 9 zeros */ ; j++) 
       counter++; 
     System.out.println("Finished" + counter); 
    } 

कार्यक्रम 2 (खत्म तुरंत):

public static void main(String[] args) 
    { 
     long counter = 0L; 
     int j; 
     for(int i = 0 ; i <= 1000000000 /* 9 zeros */ ; i++) 
      for(j = 0 ; j <= 1000000000 /* 9 zeros */ ; j++) 
       counter++; 
     System.out.println("Finished"); 
    } 

इसलिए यह संकलक पता लगाता है कि अगर वहाँ एक कर रहे हैं नेस्टेड लूप के बाहर दृश्यमान परिवर्तन, यदि कोई नहीं है, तो यह मूल रूप से अंदरूनी लूप को छोड़ देता है।

+0

हालांकि यह सच है कि लूप अनुकूलित किया गया है, यह जवाब नहीं देता है कि लंबे * का उपयोग कर लूप * अनुकूलित क्यों नहीं है। – Vulcan

+0

@ वल्कन मैं सहमत हूं कि यह ज्ञात नहीं है। हालांकि अनुकूलन तकनीक कंपाइलर के एक निश्चित संस्करण के लिए विशिष्ट है। और यह जावा भाषा विशिष्टता में नहीं है - यानी जावा कंपाइलर का कार्यान्वयन किसी भी समय बदल सकता है। 'लंबे प्रकार के प्रकार का अनुकूलन भविष्य में हो सकता है या नहीं भी हो सकता है। –

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