2013-06-06 11 views
10

मेरे पास एक सुडोकू हल करने वाला एल्गोरिदम है जिसके लिए मेरा लक्ष्य जितना तेज़ हो सके। इस एल्गोरिदम का परीक्षण करने के लिए, मैं इसे कई बार चलाता हूं और औसत की गणना करता हूं। कुछ अजीब संख्या देख के बाद, मैं हर समय मुद्रित करने का फैसला किया है और इस परिणाम मिला:कई बार निष्पादित होने के बाद मेरा एल्गोरिदम तेजी से क्यों बनता है? (जावा)

Execution Time : 4.257746 ms (#1) 
Execution Time : 7.610686 ms (#2) 
Execution Time : 6.277609 ms (#3) 
Execution Time : 7.595707 ms (#4) 
Execution Time : 7.610131 ms (#5) 
Execution Time : 5.011104 ms (#6) 
Execution Time : 3.970937 ms (#7) 
Execution Time : 3.923783 ms (#8) 
Execution Time : 4.070238 ms (#9) 
Execution Time : 4.765347 ms (#10) 
Execution Time : 0.818264 ms (#11) 
Execution Time : 0.620216 ms (#12) 
Execution Time : 0.679021 ms (#13) 
Execution Time : 0.643516 ms (#14) 
Execution Time : 0.718408 ms (#15) 
Execution Time : 0.744481 ms (#16) 
Execution Time : 0.760569 ms (#17) 
Execution Time : 0.80384 ms (#18) 
Execution Time : 0.75946 ms (#19) 
Execution Time : 0.802176 ms (#20) 
Execution Time : 66.032508 ms : average = 3.3016254000000003 

10 15 को फांसी (यह बेतरतीब ढंग से भिन्न होता है) के बाद, एल्गोरिथ्म के प्रदर्शन काफी है बेहतर बनाता है। यदि मैं इसे कई सौ बार चलाता हूं, तो यह अंततः लगभग 0.3ms पर स्थिर होगा। ध्यान दें कि मैं जेआईटी के लिए यह लूप करने के लिए इस लूप से पहले एक बार एल्गोरिदम चलाता हूं।

इसके अलावा, अगर मैं अपने लूप को चलाने से पहले 2 सेकंड के लिए थ्रेड सोता हूं, तो मेरे सारे समय 1ms (+/- 0.2) पर हैं।

इसके अलावा, अगर मैं एक सामान्य सुडोकू कुछ 500 बार मेरी पाश से पहले (1-9 तिरछे के साथ एक ग्रिड) हल, मेरी हर समय 0.3ms (+/- 0.02) के आसपास हैं।

प्रत्येक हल समान है। सभी मान रीसेट कर रहे हैं।

-क्यों प्रत्येक का समाधान समय लगातार हल के बाद सुधार करता है:

तो मेरे सवाल का कई गुना है?

- 10-15 हलकों के बाद मुझे हल समय में अचानक गिरावट क्यों आती है?

+1

JIT पहली बार चलाने पर अनुकूलन करने के लिए नहीं है। वास्तव में, यह संभवतः नहीं होगा, क्योंकि कोड को अनुकूलित करने की लागत को उचित नहीं ठहराया जा सकता है जब तक कि यह कोड का एक महत्वपूर्ण टुकड़ा साबित न हो (अक्सर पर्याप्त रूप से चलाया जाता है)। –

+7

आपने अनजाने में एक सुडोकू-सुलझाने वाले कृत्रिम जीवनform का निर्माण किया जो शायद स्काईनेट में विकसित होगा। अभी छोड़ें और नारियल बेचना शुरू करें। – Piovezan

+0

अग्निशामक से गर्म समय-यात्रा टर्मिनेटर के लिए भुगतान करने के लिए छोटी कीमत। – arynaq

उत्तर

14

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

+1

एप्लिकेशन में कुछ ऐसा हो सकता है जिससे सुधार हुआ। उदाहरण के लिए कैशिंग। पहले रनों पर कुछ डेटा बाहरी भंडारण से मतदान किया जा सकता है, लेकिन परिणामी कॉल पर उसी डेटा को कैश से लिया जा सकता है। –

+0

@AlexKreutznaer: - अपेक्षाकृत कम स्तर हाँ और उस JIT कम्पाइलर द्वारा कोड का अनुकूलन करने के .. –

+0

हाँ, JIT अपने आप ही यह होता है प्रयोग किया जाता है। लेकिन मैं शुद्ध व्यापार कैशिंग के बारे में बात कर रहा हूं। उदाहरण के लिए - आपका एप्लिकेशन कंपनियां लोड करता है (वे बहुत दुर्लभ बदलते हैं), इसलिए कैश का उपयोग नाटकीय रूप से प्रोसेसिंग समय में सुधार कर सकता है। कोई भी जेट आपके लिए ऐसा नहीं कर सकता है। –

2

अधिकतर संभावना - जेवीएम ने कई रनों के बाद अपने निष्पादन को अनुकूलित किया।

इसके अतिरिक्त एप्लिकेशन स्वयं कुछ ऐसा कर सकता था जो निष्पादन परिणामों में सुधार हुआ।

विस्तार से जानने के बिना आप जो भी चलाते हैं, वह कुछ और सटीक कहता है।

क्या आप बाहरी संसाधनों का उपयोग करते हैं - डेटाबेस कनेक्शन, जेएमएस कतार/विषय, आदि ..? क्या आप कैशिंग का उपयोग करते हैं?

सभी कि मायने रखती है ...

+1

.......... –

+0

पर जाओ मैं कुछ और अधिक टिप्पणियां जोड़ीं। –

+0

मैं केवल शुद्ध और सरल जावा का उपयोग करता हूं। कोई कतार नहीं, कोई कैश नहीं, कोई धागा नहीं, कोई डीबी नहीं। एप्लिकेशन प्रत्येक लूप निष्पादन के बीच अपने डेटा को पूरी तरह से रीसेट करता है। – Paradoxyde

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