यह वास्तव में एक गहरा मुद्दा है जिसमें कुछ पद्धतिगत और कुछ व्यावहारिक उत्तर हैं। मुझे लगता है कि आप एल्गोरिदम के बारे में कुछ जानना चाहते हैं । यदि आप यह जानना चाहते हैं कि दिए गए इनपुट पर कौन सी एल्गोरिथ्म बेहतर तरीके से काम करती है, तो आगे बढ़ें और रनटाइम्स को मापें। यदि आप किसी दिए गए एल्गोरिथ्म के लिए एक कंपाइलर की गुणवत्ता की तुलना करना चाहते हैं, तो आगे बढ़ें और रनटाइम्स को मापें। एल्गोरिथ्म के बारे में कुछ सीखने के लिए, यह मत करो।
मुझे पहले कुछ कारण बताएं कि रनटाइम्स का उपयोग करना एक अच्छा विचार क्यों नहीं है।
यदि आप किसी भी घटक को बदलते हैं तो एक मशीन पर एक भाषा और एक संकलक का उपयोग करके मापा जाने वाला सामान्यता रनंटाइम का कोई मतलब नहीं है। यहां तक कि एक ही एल्गोरिथ्म के थोड़ा अलग कार्यान्वयन अलग तरीके से प्रदर्शन कर सकते हैं क्योंकि आप मामले में कुछ संकलक opimisation को ट्रिगर करते हैं लेकिन दूसरे में नहीं।
- भविष्यवाणी
तो आप कुछ आदानों के लिए कुछ रनटम्स हैं। वह जो किसी अन्य इनपुट के रनटाइम के बारे में बताता है? सामान्य तौर पर, कुछ भी नहीं।
- महत्व
आमतौर पर, आप सभी इनपुट (कुछ आकार के) बेंचमार्क नहीं करेंगे , ताकि तुरंत एल्गोरिदम की तुलना करने की आपकी क्षमता को प्रतिबंधित किया जा सके: हो सकता है कि आपके परीक्षण सेट ने एक में सबसे खराब स्थिति और दूसरे एल्गोरिथम में सबसे अच्छा मामला शुरू किया हो? या शायद आपके इनपुट रनटाइम व्यवहार को प्रदर्शित करने के लिए बहुत छोटे थे ।
- मीटरिंग
रनटाइम्स को अच्छी तरह से मापना तुच्छ नहीं है। क्या कोई JIT है? वहाँ विवाद हो गया है, यानी आप उस समय की गिनती कर रहे हैं जब एल्गोरिथ्म भी नहीं चला था? क्या आप विशेष रूप से समवर्ती प्रक्रियाओं और कैश में एक अन्य रन (अन्य एल्गोरिथ्म) के लिए बिल्कुल उसी मशीन की स्थिति को पुन: उत्पन्न कर सकते हैं? मेमोरी लेटेंसी से कैसे निपटा जाता है?
मुझे उम्मीद है कि ये आपको आश्वस्त करेंगे कि एल्गोरिदम की तुलना करने के लिए रनटाइम्स एक भयानक उपाय हैं, और एल्गोरिथ्म रनटाइम की जांच के लिए कुछ सामान्य, सार पद्धति की आवश्यकता है।
प्रश्न के दूसरे भाग पर। हम तुलना या समान प्राथमिक संचालन का उपयोग क्यों करते हैं?
विश्लेषणात्मक ट्रैफ़िकबिलिटी
यह मानते हुए कि आप औपचारिक विश्लेषण करना चाहते हैं, आपको इसे करने में सक्षम होना चाहिए । व्यक्तिगत बयानों की गिनती बहुत तकनीकी है, कभी-कभी कठिन भी; कुछ लोग फिर भी ऐसा करते हैं (जैसे नथ)। केवल कुछ बयानों की गिनती - जो रनटाइम पर हावी हैं - आसान है। उसी कारण से, हम अक्सर "केवल" जांच (ऊपरी सीमा पर) सबसे खराब स्थिति में करते हैं।
प्रभुत्व
चयनित ऑपरेशन रनटाइम पर हावी है। इसका मतलब यह नहीं है कि यह सबसे अधिक रनटाइम में योगदान देता है - तुलना स्पष्ट रूप से नहीं करता है, उदाहरण के लिए क्विकॉर्ट में जब शब्द-आकार के पूर्णांक को छाँटते हैं। लेकिन उन्हें सबसे अधिक बार निष्पादित किया जाता है , इसलिए उन्हें गिनकर आप गणना करते हैं कि एल्गोरिथ्म के सबसे निष्पादित भागों को कितनी बार चलाया जाता है। नतीजतन, आपका स्पर्शोन्मुख क्रम प्रमुख प्राथमिक ऑपरेशन की संख्या के लिए आनुपातिक है। यही कारण है कि हम Landau संकेतन और "रनटाइम" शब्द का उपयोग करते हुए सहज हैं, भले ही हम केवल तुलना करते हैं।
ध्यान दें कि एक से अधिक ऑपरेशन को गिनना उपयोगी हो सकता है। उदाहरण के लिए, कुछ क्विकॉर्ट वेरिएंट अधिक तुलना करते हैं, लेकिन दूसरों की तुलना में कम स्वैप करते हैं (औसतन)।
आपके द्वारा सभी सिद्धांत किए जाने के बाद, यह सुनिश्चित करने के लायक है कि आप अपने सिद्धांत के पूर्वानुमानों को सत्यापित करने के लिए रनटाइम को फिर से चालू करना चाहते हैं। यदि वे नहीं हैं, तो आपका सिद्धांत उपयोगी नहीं है (व्यवहार में) और इसे बढ़ाया जाना चाहिए। मेमोरी पदानुक्रम पहली चीजों में से एक है जिसे आप महसूस करते हैं महत्वपूर्ण है लेकिन बुनियादी विश्लेषणों में गायब है।