2011-01-04 14 views
11

मैं विभिन्न बाहरी कमांड लाइन कॉल के निष्पादन समय का मूल्यांकन करने के लिए रूबी 1.9.2 स्क्रिप्ट लिख रहा हूं।कमांड लाइन कॉल के निष्पादन समय को मापने

मैं गहरे लाल रंग का Process.system विधि का इस्तेमाल किया कमांड लाइन कॉल निष्पादित करने के लिए और इस प्रकार क्रियान्वित समय पर कब्जा करने की कोशिश की:

start = Time.now 
system("./script1", "argX") 

puts "Duration: #{Time.now - start} seconds" 

अब मैं उस अवधि निष्पादन समय को प्रतिबिंबित नहीं करता समस्या है बाहरी प्रक्रिया का लेकिन "सिस्टम" कॉल का निष्पादन समय।

कोई विचार है कि मैं बाहरी प्रक्रिया के निष्पादन समय को कैसे माप सकता हूं?

उत्तर

2

यदि मैं सही ढंग से समझता हूं, तो आप रूबी प्रक्रिया को अपनी स्क्रिप्ट निष्पादित करना चाहते हैं। जब आप * निक्स सिस्टम पर काम कर रहे हों तो आप time उपयोगिता का उपयोग कर सकते हैं। इसके बाद आप निम्न कार्य कर सकते हैं: time ruby *yourscript*

+0

मैक रनिंग आरवीएम –

+0

मैक पर भी काम करता है * निक्स सिस्टम हाहा – Jay

12

ठीक है। अगर मैं समझता हूं कि आप क्या करने की कोशिश कर रहे हैं, तो आप समय लेना चाहते हैं कि "./script1" कॉल कितनी देर तक चलती है?

एक चीज जो आप करना चाहते हैं benchmark लाइब्रेरी (यह मानक है) का उपयोग करना है।

require 'benchmark' 

Benchmark.bm (7) do |x| 
    x.report ("script1:") {system("./script1", "argX")} 
end 

इससे उपयोगकर्ता और सिस्टम के समय के साथ एक रिपोर्ट उत्पन्न होगी, जो आप चाहते हैं।

+0

यदि मैं इस तरह से बेंचमार्क लाइब्रेरी का उपयोग करके गलत नहीं हूं, तो सिस्टम कमांड चलाने के लिए अभी भी समय लगेगा। – nan

3

आप time का उपयोग करें और परिणाम

require 'open3' 

command = './script1 argX' 

stdout,stderr,status = Open3.capture3("time #{command}") 

results = {} 
stderr.split("\n").each do |line| 
    unless line.blank? 
    result_type,result = line.split("\t") 
    results[result_type] = result 
    end 
end 
puts "Clock time was #{results['real']}" 

time आउटपुट की तरह

real 0m0.003s 
user 0m0.001s 
sys 0m0.002s 

एक प्रारूप पार्स और यह करने के लिए इसे आउटपुट मानक त्रुटि, जिसके कारण हम उपयोग करने की आवश्यकता कर सकते हैं Open3 इसे प्राप्त करने के लिए (और इसे अपनी स्क्रिप्ट के आउटपुट से अलग करें, जो उम्मीद है कि time के आउटपुट के साथ संघर्ष नहीं करेगा)।

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

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