2009-01-04 17 views
62

क्या कोई भी स्टॉपवॉच बेंचमार्किंग का उपयोग करता है, या हमेशा एक प्रदर्शन उपकरण का उपयोग किया जाना चाहिए? क्या जावा के लिए कोई अच्छा मुफ्त उपकरण उपलब्ध है? आप किन उपकरणों का उपयोग करते हैं?स्टॉपवॉच बेंचमार्किंग स्वीकार्य है?

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

बेंचमार्किंग करते समय आप ऑपरेटिंग सिस्टम शेड्यूलिंग को कैसे संबोधित करते हैं?

उत्तर

41

स्टॉपवॉच बेंचमार्किंग ठीक है, बशर्ते आप सार्थक होने के लिए पर्याप्त पुनरावृत्तियों को मापें। आमतौर पर, मुझे कुछ सिंगल अंकों के सेकंड के कुल विलुप्त होने की आवश्यकता होती है। अन्यथा, आपके परिणाम शेड्यूलिंग और अन्य प्रक्रियाओं में अन्य ओ/एस बाधाओं से आसानी से कम हो जाते हैं।

इसके लिए मैं बहुत समय पहले निर्मित स्थिर विधियों का एक छोटा सा सेट उपयोग करता हूं, जो System.currentTimeMillis() पर आधारित हैं।

प्रोफाइलिंग कार्य के लिए मैंने कई वर्षों से jProfiler का उपयोग किया है और इसे बहुत अच्छा पाया है। मैंने हाल ही में YourKit पर देखा है, जो वेबसाइट से बहुत अच्छा लगता है, लेकिन मैंने इसका इस्तेमाल व्यक्तिगत रूप से नहीं किया है।

शेड्यूलिंग बाधाओं पर प्रश्न का उत्तर देने के लिए, मुझे लगता है कि जब तक प्रक्रिया समय-निर्धारण से असंगत परिणामों को कम करने के लिए निरंतरता हासिल नहीं होती है, तब तक निरंतरता हासिल की जाती है। मुझे यह भी पता चलता है कि थ्रेड शेड्यूलिंग का 5 से 30 सेकंड के बीच के लिए कोई व्यावहारिक प्रभाव नहीं पड़ता है। आखिरकार, कुछ सेकंड थ्रेसहोल्ड शेड्यूलिंग पास करने के बाद, मेरे अनुभव में, परिणामों पर नगण्य प्रभाव पड़ता है - मुझे लगता है कि 5 सेकंड रन लगातार समय/पुनरावृत्ति के लिए 5 मिनट के रन के समान होता है।

आप जेआईटी को "गर्म" करने के लिए 10,000 बार परीक्षण कोड को पूर्ववत करने पर भी विचार करना चाहेंगे, उस समय के आधार पर जब आप वास्तविक जीवन में परीक्षण कोड को समय के साथ चलाने की अपेक्षा करते हैं।

+0

धन्यवाद। मुझे एहसास हुआ कि यह बहुत आम होने वाला था, मुझे बस बिना किसी पुष्टि के अपने आप को उचित ठहराना पड़ा। :) –

0

मैं हमेशा स्टॉपवॉच बेंचमार्किंग का उपयोग करता हूं क्योंकि यह इतना आसान है। हालांकि मुझे परिणामों के लिए बहुत सटीक होने की आवश्यकता नहीं है। यदि आपको सटीक परिणामों की आवश्यकता है तो आपको स्टॉपवॉच बेंचमार्किंग का उपयोग नहीं करना चाहिए।

0

मुझे नहीं लगता कि स्टॉपवॉच बेंचमार्किंग बहुत भयानक है, लेकिन यदि आप सोलार्स या ओएस एक्स मशीन पर जा सकते हैं तो आपको डीटी्रेस की जांच करनी चाहिए। मैंने इसे अपने अनुप्रयोगों में समय के बारे में कुछ अच्छी जानकारी प्राप्त करने के लिए उपयोग किया है।

5

एक प्रोफाइलर आपको अधिक विस्तृत जानकारी देता है, जो perf समस्याओं का निदान और ठीक करने में मदद कर सकता है।

वास्तविक माप के संदर्भ में, स्टॉपवॉच समय उन इसलिए यदि आप मान्य करने के लिए है कि चीजें स्वीकार्य सीमा के भीतर कर रहे हैं चाहते हैं क्या नोटिस है, स्टॉपवॉच समय ठीक है।

आप वास्तव में समस्याओं को ठीक करना चाहते हैं, तथापि, एक प्रोफाइलर वास्तव में सहायक हो सकता है।

1

मैं आज के माध्यम से की खोज और dBase फाइलों का एक समूह से जानकारी एकत्र की एक प्रोग्राम भाग गया, यह सिर्फ एक घंटे चलाने के लिए पदभार संभाल लिया। मैं कोड पर एक नज़र ले लिया है, क्या अड़चन था का उचित अनुमान बनाया है, एल्गोरिथ्म के लिए एक छोटी सी सुधार किया है, और कार्यक्रम, इस बार यह 2.5 मिनट में पूरा reran। मुझे यह बताने के लिए कि कोई नया संस्करण एक महत्वपूर्ण सुधार था, मुझे किसी भी फैंसी प्रोफाइलिंग टूल या बेंचमार्क सूट की आवश्यकता नहीं थी। अगर मैं आगे चल रहा है समय का अनुकूलन करने के लिए आवश्यक मैं शायद कुछ और अधिक परिष्कृत विश्लेषण किया होता, लेकिन यह आवश्यक नहीं था।मुझे लगता है कि इस तरह के "स्टॉपवॉच बेंचमार्किंग" कई मामलों में एक स्वीकार्य समाधान है और अधिक उन्नत उपकरणों का सहारा लेना वास्तव में इन मामलों में अधिक समय लेने वाला होगा।

+1

मुझे किसी वैध कारण के लिए डाउनवॉइंट पर कोई फर्क नहीं पड़ता है, लेकिन कम से कम यह समझाने की सभ्यता है कि जब आप ऐसा करते हैं तो उत्तर के साथ गलत/अनुपयोगी क्या होता है। –

0

मैं इसे हर समय करता हूं। मैं एक प्रोफाइलर का उपयोग करना चाहता हूं, लेकिन डोमेन-विशिष्ट भाषा का विक्रेता जो मैं काम कर रहा हूं वह एक प्रदान नहीं करता है।

6

यह तब तक मान्य है जब तक आप समय के पर्याप्त अंतराल को मापते हैं। मैं परीक्षण करने का इरादा रखने के 20-30 रन निष्पादित करता हूं ताकि कुल व्यतीत समय 1 सेकंड से अधिक हो। मैंने देखा है कि System.currentTimeMillis() के आधार पर समय गणनाएं 0ms या ~ 30ms होती हैं; मुझे नहीं लगता कि आप इससे कहीं ज्यादा सटीक हो सकते हैं। आप System.nanoTime() बाहर की कोशिश करना चाहते हो सकता है यदि आप वास्तव में एक छोटे से समय अंतराल को मापने के लिए की जरूरत है:

1

सब के बाद, यह शायद बेंच मार्किंग के दूसरे सबसे लोकप्रिय रूप है, सही होने के बाद "नो-घड़ी मानदंड" - हम कहाँ कहते हैं कि "इस गतिविधि धीमा लग रहा है, कि एक तेजी से लगता है।"

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

2

प्रोफाइलर्स समय के रास्ते में आ सकते हैं, इसलिए मैं समग्र प्रदर्शन समस्याओं की पहचान करने के लिए स्टॉपवॉच समय के संयोजन का उपयोग करता हूं, फिर कार्य करने के लिए प्रोफाइलर का उपयोग करें जहां समय बिताया जा रहा है। आवश्यकतानुसार दोहराएं।

1

मुझे लगता है कि एक महत्वपूर्ण सवाल ऑपरेशन के समय की जटिलता और लंबाई है।

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

हालांकि, कंप्यूटर पर किसी भी प्रकार की घड़ी प्रणाली के लिए कॉल द्वारा प्रदान किया गया स्वचालन, जैसे लिंक किए गए आलेख में उल्लिखित जावा मिलिस कॉल, मैन्युअल रूप से देखने के लिए स्पष्ट रूप से बेहतर है कि कुछ कितना समय चलता है।

प्रोफाइलर्स अच्छे होते हैं, जब वे काम करते हैं, लेकिन मुझे उनके आवेदन में आवेदन करने में समस्याएं होती हैं, जिनमें आम तौर पर गतिशील कोड पीढ़ी, डीएलएल की गतिशील लोडिंग, और दोनों अंतर्निहित समय-समय पर किए गए काम शामिल होते हैं- मेरे आवेदन की संकलित स्क्रिप्टिंग भाषाओं। वे जटिल स्रोत के लिए एक एकल स्रोत भाषा और अन्य अवास्तविक अपेक्षाओं को मानने के लिए अक्सर सीमित हैं।

4

स्टॉपवॉच वास्तव में सबसे अच्छा बेंचमार्क है!

उपयोगकर्ता प्रतिक्रिया समय समाप्त करने का वास्तविक अंत वह समय है जो वास्तव में मायने रखता है।

उपलब्ध टूल का उपयोग करके इस बार प्राप्त करना हमेशा संभव नहीं होता है, उदाहरण के लिए अधिकांश परीक्षण टूल में ब्राउज़र को पृष्ठ प्रस्तुत करने में लगने वाला समय शामिल नहीं होता है, इसलिए बुरी तरह लिखित सीएसएस के साथ एक अतिव्यापी पृष्ठ उप-दूसरी प्रतिक्रिया दिखाएगा परीक्षण उपकरण के लिए समय, लेकिन, उपयोगकर्ता के लिए 5 सेकंड और प्रतिक्रिया समय।

उपकरण स्वचालित परीक्षण के लिए बहुत अच्छे हैं, और समस्या निर्धारण के लिए, लेकिन आप जो वास्तव में मापना चाहते हैं उसे न खोएं।

4

आपको पुनरावृत्ति की यथार्थवादी संख्या का परीक्षण करने की आवश्यकता है क्योंकि आप समय की जांच कैसे करते हैं इसके आधार पर आपको अलग-अलग उत्तर मिलेंगे। यदि आप केवल एक बार ऑपरेशन करते हैं, तो यह कई पुनरावृत्तियों का औसत लेने के लिए भ्रामक हो सकता है। यदि आप जानना चाहते हैं कि जेवीएम गर्म हो गया है तो आप कई (उदाहरण के लिए 10,000) पुनरावृत्तियों को चला सकते हैं जो समय में शामिल नहीं हैं।

मैं यह भी सुझाव देता हूं कि आप System.nanoTime() का उपयोग अपने अधिक सटीक के रूप में करें। यदि आपका परीक्षण समय लगभग 10 माइक्रो-सेकेंड या उससे कम है, तो आप इसे अक्सर कॉल नहीं करना चाहते हैं या यह आपका परिणाम बदल सकता है। (उदाहरण मैं कहना 5 सेकंड के लिए परीक्षण कर रहा हूँ और मैं जानना चाहता हूँ जब यह ऊपर है मैं केवल nanoTime हर 1000 पुनरावृत्तियों मिलता है, अगर मैं जानता हूँ कि एक यात्रा बहुत जल्दी है)

1

आप कैसे काम कर सुलझाया है प्रणाली शेड्यूलिंग जब बेंचमार्किंग?

बेंचमार्क उस प्रणाली पर लंबे समय तक पर्याप्त है जो मशीन का प्रतिनिधि है जिसका आप उपयोग करेंगे। यदि आपका ओएस आपके आवेदन को धीमा कर देता है, तो वह परिणाम का हिस्सा होना चाहिए।

कहने में कोई बात नहीं है, मेरा कार्यक्रम तेज होगा, अगर केवल मेरे पास ओएस नहीं था।

आप Linux का उपयोग कर रहे हैं, तो आप इस तरह के numactl, chrt और taskset के रूप में कैसे सीपीयू उपयोग किया जाता है और समय-निर्धारण को नियंत्रित करने के उपकरणों का उपयोग कर सकते हैं।

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