स्क्रिप्ट के औसत निष्पादन समय को कैसे मापें?


23

मेरे पास दो स्क्रिप्ट हैं जो प्रत्येक संख्या के भाज्य की गणना करती हैं। मैं जानना चाहूंगा कि कौन सी चीज तेज है। timeआदेश मुझे मिलीसेकेंड देता है और परिणाम समय-समय पर अलग है:

piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.089s
user    0m0.052s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.091s
user    0m0.048s
sys 0m0.036s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.088s
user    0m0.048s
sys 0m0.040s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.088s
user    0m0.048s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.087s
user    0m0.064s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.089s
user    0m0.068s
sys 0m0.016s
piousbox@piousbox-laptop:~/projects/trash$ 

स्क्रिप्ट चलाने में मुझे औसत समय कैसे लगेगा? मैं पार्स कर सकता हूं और 100 के आउटपुट का औसत निकाल सकता हूं timeलेकिन मुझे लगता है कि बेहतर समाधान है?


जवाबों:


4

नहीं, औसत का आपका विचार सही है।

स्क्रिप्ट का निष्पादन बहुत सारे कारकों पर निर्भर करता है, और हालाँकि इसे सेटअप समय (मेमोरी में इंटरप्रेटर लोड करना, सेट अप करना और संभवतः कोड को बाइटकोड या मशीन कोड में संकलित करना) और सही निष्पादन समय के बीच विभाजित करना है।

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

कुल समय पर ध्यान केंद्रित करने के लिए, आप स्क्रिप्ट को एक सौ बार निष्पादित करते हैं और परिणामों को औसत करते हैं। आदर्श रूप से, आपको उन निष्पादन को पर्याप्त रूप से अलग करना चाहिए जो कि सिस्टम हर बार "संदर्भ स्थिति" (या स्क्रिप्ट-असंबंधित स्थिति) में लौटता है। उदाहरण के लिए, दुभाषिया खुद को स्मृति में कैश्ड कर देगा, ताकि स्क्रिप्ट का पहला निष्पादन बाद के लोगों की तुलना में काफी धीमा हो जाएगा।

एल्गोरिथ्म पर एक बेहतर अंतर्दृष्टि प्राप्त करने के लिए, मुझे लगता है कि सबसे अच्छा तरीका कुछ ऐसा है (अन्यथा बेकार मशीन पर):

  • एक एकल फ़ंक्शन में एल्गोरिथ्म लपेटें।
  • नियंत्रण एप्लिकेशन में:
    • एक बार फ़ंक्शन को कॉल करें
    • सिस्टम ("दीवार घड़ी") समय प्राप्त करें और 10 (या एक उचित एन) सेकंड जोड़ें
    • लूप दर्ज करें और पुनरावृत्तियों की गिनती शुरू करें
    • फ़ंक्शन के लिए प्रत्येक कॉल के बाद, काउंटर बढ़ाएँ
    • यदि सिस्टम का समय बचाया समय से कम है, तो एक और लूप करें
    • वर्तमान दीवार घड़ी समय से सटीक एन, संभवतः फ्लोटिंग पॉइंट प्राप्त करें
    • एन द्वारा विभाजित काउंटर प्रदर्शित करें: यह पुनरावृत्तियों / सेकंड की संख्या है।

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

यदि फ़ंक्शन एक इनपुट प्राप्त करता है, तो आप एक निश्चित मान के साथ PRNG का उपयोग करके इनपुट का एक यादृच्छिक अनुक्रम प्रदान करने के लिए अच्छी तरह से आपूर्ति करेंगे, यह सुनिश्चित करने के लिए कि फ़ंक्शन के दोनों संस्करणों को समान मान प्राप्त होते हैं। यह "लकी नंबर" के कारण स्पष्ट रूप से बेहतर प्रदर्शन करने वाले एक फ़ंक्शन से बचता है (जैसे मुझे हिल्सोर्ट एल्गोरिथम का एक रूपांतर याद है जो औसत दर्जे का बेहतर प्रदर्शन करता है अगर छंटनी की जाने वाली वस्तुओं की संख्या 2 k- 1 में छोटे k s के साथ थी)।


सही है, धन्यवाद। मैंने देखा कि बाद में कॉल कम हो रही हैं। मैं अब स्क्रिप्ट के अंदर लूप चलाता हूं, और पाया कि एक एल्गोरिथ्म निश्चित रूप से दूसरे की तुलना में तेज है।
विक्टर पियसबॉक्स

39

आप प्रोग्राम के पुनरावृत्तियों को लूप में चला सकते हैं; और पुनरावृत्तियों की संख्या से कुल समय को विभाजित करें:

time for i in {1..10}; do sleep 1; done
real    0m10.052s
user    0m0.005s
sys 0m0.018s

2
सुपर सरल, यह प्यार करता हूँ। मैंने {1..10}पहले कभी नहीं देखा और चकित हूं कि यह काम करता है, इसे बाश मैनुअल में नहीं मिल सकता है। केवल दुःख की बात यह है कि आपको अपने परिणाम (न्यूनतम और अधिकतम समय) के प्रसार का पता नहीं है।
डब्ल्यूटीटी

@ w00t:man -P 'less +/Brace\ Expansion' bash
user2683246

धन्यवाद @ user2683246! मैंने तब इसे gnu.org/software/bash/manual/bash.html#Brace-Expansion पर भी पाया - कम btw का अच्छा उपयोग। अब मैं इस बारे में उत्सुक हूं कि जब यह बैश में दिखाई दिया ...
w00t

1
अहा, संस्करण 3, 10 साल बाद मैंने bash का उपयोग करना शुरू किया :) tldp.org/LDP/abs/html/bashver3.html
w00t

2
यदि यह Googlers के आगमन के लिए काम नहीं कर रहा है, तो ऐसा हो सकता है क्योंकि आप नहीं चल रहे हैं bash/bin/bashइससे पहले दौड़ने की कोशिश करें।
कोरी क्लेन

14

एक उपकरण है जिसे मल्टीटाइम कहा जाता है जो ठीक यही करता है: एक कमांड को कई बार चलाना, यह मापने में कितना समय लगता है (वास्तविक / उपयोगकर्ता / मतलब के साथ सिस्टम, न्यूनतम / अधिकतम और औसत समय स्वचालित रूप से गणना की जाती है)

उदाहरण के लिए, समान स्क्रिप्ट को 100 बार मापने के लिए:

multitime -q -n 100 "fact1.sh"
===> multitime results
1: -q fact1.sh
            Mean        Std.Dev.    Min         Median      Max
real        0.122       0.032       0.086       0.116       0.171       
user        0.148       0.044       0.096       0.137       0.223       
sys         0.023       0.019       0.000       0.014       0.061 

12

यह पुराना है, लेकिन यह Google पर बहुत अधिक है जब मैं एक कमांड की तलाश कर रहा था जो मैंने पहले इस्तेमाल किया था, लेकिन नहीं मिला। वैसे भी, ऐसा करने का मेरा पसंदीदा तरीका है:

perf stat -r 10 -B sleep 1

यह अंत में औसत निष्पादन समय सहित कई विवरण देता है:

1.002248382 seconds time elapsed                   ( +-  0.01% )


1

हाइपरफाइन एक और विकल्प है।

नमूना उपयोग:

hyperfine --warmup 3 'ruby fac1.rb'

1
हाइपरफाइन अन्य विकल्पों की तुलना में इतना बेहतर है कि यह हास्यास्पद है। रन की आवश्यकता, वार्मअप, सुंदर आउटपुट, मार्कटेशन रिपोर्ट, जंग में लिखा हुआ, आदि
क्लैस मेलबॉर्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.