मैं निम्नलिखित दो कार्यक्रमों है फर्क सिर्फ इतना है पाश चर (int
और long
) का प्रकार है।पुनरावृत्ति गति बनाम लंबे
जब मैं इसे चलाता हूं, तो पहला प्रोग्राम लगातार 0 और 16 एमसीईसी के बीच प्रिंट करता है, भले ही N
के मान के बावजूद। दूसरा बहुत लंबा लगता है। N == Integer.MAX_VALUE
के लिए, यह मेरी मशीन पर लगभग 1800 एमसीईसी में चलता है। N
में रन टाइम कम या ज्यादा रैखिक प्रतीत होता है।
तो यह क्यों है?
मुझे लगता है कि जेआईटी-कंपाइलर int
लूप को मौत के लिए अनुकूलित करता है। और अच्छे कारण के लिए, क्योंकि जाहिर है कि यह कुछ भी नहीं करता है। लेकिन यह long
लूप के लिए ऐसा क्यों नहीं करता है?
एक सहयोगी ने सोचा कि हम long
लूप में अपना काम कर रहे जेआईटी कंपाइलर को माप सकते हैं, लेकिन चूंकि रन टाइम N
में रैखिक प्रतीत होता है, तो शायद यह मामला नहीं है।
मैं JDK 1.6.0 अद्यतन 17 उपयोग कर रहा हूँ:
C:\>java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)
मैं Windows XP Professional x64 संस्करण पर हूँ, सर्विस पैक 2, 2.40GHz पर एक इंटेल Core2 Quad सीपीयू के साथ।
अस्वीकरण
मुझे पता है कि microbenchmarks उत्पादन में उपयोगी नहीं हैं। मुझे यह भी पता है कि System.currentTimeMillis()
उतना सटीक नहीं है जितना इसके नाम से पता चलता है। यह सिर्फ कुछ है जो मैंने चारों ओर बेवकूफ़ बनाते हुए देखा, और मैं बस इतना उत्सुक था कि ऐसा क्यों होता है; और कुछ नहीं।
मैं बिल्कुल यहाँ @Andrzej से सहमत है, लेकिन यह वास्तव में सिर्फ जिज्ञासा की खातिर अगर, आप वास्तव में जेनरेट किए गए कोड को देखने के लिए PrintAssembly प्लगइन का उपयोग कर सकते हैं: http://wikis.sun.com/display/HotSpotInternals/PrintAssembly –
यदि आप -Xint ध्वज के साथ भागते हैं तो क्या होता है? यह हॉटस्पॉट संकलन को रोकता है, इसलिए आपको बेहतर तुलना मिल जाएगी। –
@ स्टेवेन: लेकिन '-Xint' के साथ परिणाम वास्तविक उपयोग जैसा कुछ भी * कम * सार्थक है। –