R में कार्य करना [बंद]


36
  1. मैं उस समय को मापना चाहूंगा जो किसी फ़ंक्शन को चलाने में दोहराता है। के replicate()लिए उपयोग कर रहे हैं और छोरों बराबर? उदाहरण के लिए:

    system.time(replicate(1000, f()));
    system.time(for(i in 1:1000){f()});

    जो पसंदीदा तरीका है।

  2. के आउटपुट में system.time(), sys+userप्रोग्राम को चलाने के लिए वास्तविक CPU समय है? है elapsedकार्यक्रम के समय प्रदर्शन का एक अच्छा उपाय है?


3
केवल रिकॉर्ड के लिए, चूंकि मुझे स्पष्ट रूप से इस प्रश्न के पाठ्यक्रम को बदलने में बहुत देर हो चुकी है: यह एक ऐसा मुद्दा है जो मुझे लगता है कि स्टैकऑवरफ्लो के लिए सबसे उपयुक्त है।
मैट पार्कर

2
@ मैट मैं इस बात से सहमत हूँ कि एसओ के लिए एक कार्यक्रम कितनी बार अच्छी तरह से अनुकूल है। मैं इस बात से भी सहमत हूं कि इस प्रश्न की एक शाब्दिक व्याख्या (जैसा कि कई उत्तरों द्वारा ली गई है) सीवी पर इसे यहां विषय के रूप में प्रस्तुत करेगी। एक समय प्रयोग को तैयार करने और एक ऐसे प्रयोग के परिणामों के विश्लेषण में हालांकि कुछ सांख्यिकीय रुचि प्रतीत होती है ।
whuber

जवाबों:


19

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

NmN/m

प्रायोगिक डिजाइन के इन बुनियादी सिद्धांतों का उपयोग करके, आप अनिवार्य रूप से किसी भी अंतर के लिए नियंत्रण करते हैं कि आप कोड को कैसे तैनात करते हैं (उदाहरण के लिए, लूप और प्रतिकृति () के बीच का अंतर)। जिससे आपकी समस्या दूर हो जाती है।


25

आपके दो बिंदुओं के बारे में:

  1. यह शैलीगत है। मुझे replicate()यह पसंद है कि यह कार्यात्मक है।
  2. मैं elapsedतीसरे नंबर पर ध्यान केंद्रित करता हूं ।

जो मैं अक्सर करता हूं

N <- someNumber
mean(replicate( N, system.time( f(...) )[3], trimmed=0.05) )

कॉलिंग के 90% एन पुनरावृत्ति का छंटनी मतलब पाने के लिए f()

(एक विचारक को पकड़ने के लिए हेडली को धन्यवाद दिया गया।)


2
क्या आपका मतलब नहीं है mean(replicate(N, system.time(f(...))[3]), trim = 0.05)?
हैडले

2
यदि f () कॉल लंबी है तो ठीक है। हालाँकि, यदि f () कॉल कम है, तो किसी भी समय कॉल ओवरहेड की संभावना त्रुटि माप में वृद्धि होगी। System.time () के लिए एक कॉल के साथ f () के कई पुनरावृत्तियों पर एक त्रुटि को कॉल को विभाजित करने के लिए तब तक मिलता है जब तक कि यह कुछ असीम मूल्य नहीं होता (और यह तेजी से वापस लौटता है)।
जॉन

@ जॉन: धन्यवाद, लेकिन मैंने जो कहा, वह आपको नहीं मिलेगा। मैं अभी भी सोच रहा हूं कि कौन सा बेहतर है, सिस्टम (समय के अंदर या बाहर) एफ को दोहरा रहा है?
टिम

System.time () कमांड के प्रत्येक कॉल में कुछ परिवर्तनशील समय होता है, जिसमें कॉल करने के लिए कुछ माप की त्रुटि होती है। यह एक छोटी राशि है। लेकिन क्या हो अगर f () एक बहुत ही संक्षिप्त कॉल है? तब इस त्रुटि को कॉल एफ () में लगने वाले समय के साथ भ्रमित किया जा सकता है। इसलिए, जब आप f को एक एकल system.time () कॉल के अंदर 1e5 बार कॉल करते हैं, तो त्रुटि 1e5 विखंडू में विभाजित हो जाती है। जब आप हर f () के लिए system.time () को कॉल करते हैं, तो इसका प्रभाव सार्थक हो सकता है यदि f () के लिए समय छोटा है। बेशक, अगर आप सभी की जरूरत सापेक्ष समय है यह बहुत बात नहीं है।
जॉन

ओह, और दूसरा हिस्सा यह है कि यह सिर्फ एक बार system.call () को कॉल करने के लिए तेज़ होगा।
जॉन

10

आप समय के अनुसार लौट सकते हैं Sys.time; यह निश्चित रूप से वॉलटाइम मापता है, इसलिए वास्तविक समय गणना समय। उदाहरण कोड:

Sys.time()->start;
replicate(N,doMeasuredComputation());
print(Sys.time()-start);

3

उपयोग करने के लिए किस समय मीट्रिक के बारे में, मैं अन्य उत्तरदाताओं को नहीं जोड़ सकता।

उपयोग करने के लिए फंक्शन के बारे में, मुझे rbchmark पैकेज से बेंचमार्क का उपयोग करना पसंद है ।


1

वे अलग-अलग काम करते हैं। समय जो आप की इच्छा है। प्रतिकृति () फ़ंक्शन के प्रत्येक निष्पादन के परिणामों का एक वेक्टर देता है। लूप के लिए नहीं है। इसलिए, वे समकक्ष कथन नहीं हैं।

इसके अलावा, समय कई तरीकों से आप कुछ करना चाहते हैं। तब आप सबसे कुशल विधि पा सकते हैं।


mod-tip: डर्क के उत्तर के लिए एक टिप्पणी के रूप में दूसरा भाग पोस्ट करें।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.