2011-06-17 11 views
5

के बिना उपयोगकर्ता समय या सिस्टम समय को मापें क्योंकि मैं इस समय कुछ समय माप कर रहा हूं, मुझे आश्चर्य हुआ कि Benchmark कक्षा या कमांड लाइन का उपयोग किए बिना उपयोगकर्ता समय या सिस्टम समय को मापना संभव है या नहीं उपयोगिता timeरूबी में बेंचमार्क या समय

Time कक्षा का उपयोग केवल दीवार घड़ी का समय बताता है, सिस्टम और उपयोगकर्ता समय नहीं, हालांकि मैं ऐसे समाधान की तलाश में हूं जिसमें समान लचीलापन हो, उदा।

time = TimeUtility.now 
# some code 
user, system, real = TimeUtility.now - time 

कारण यह है कि मैं किसी भी तरह Benchmark नापसंद करते हैं, के बाद से यह संख्या वापस नहीं लौट सकते ही है (संपादित करें: मैं गलत था - यह नीचे जवाब देख सकते हैं।।)। निश्चित रूप से, मैं आउटपुट पार्स कर सकता था, लेकिन यह सही नहीं लगता है। * NIX सिस्टम से time उपयोगिता के रूप में अच्छी तरह से मेरी समस्या का समाधान करना चाहिए, लेकिन मुझे पता है कि अगर वहाँ पहले से ही रूबी में लागू तो मैं अपने आप को करके इन प्रणाली कॉल करने के लिए की जरूरत नहीं है आवरण के कुछ प्रकार है चाहता था।

बहुत बहुत धन्यवाद!

उत्तर

8

मैं बेंचमार्क प्रलेखन फिर से पढ़ सकते हैं और देखा कि यह एक विधि measure नामित किया है। इस विधि बिल्कुल वही करती जो मैं चाहता: समय अपने कोड की जरूरत का आकलन करें और एक वस्तु है जो उपयोगकर्ता समय होता है, सिस्टम का समय, बच्चों आदि की व्यवस्था समय लौटने यह है के रूप में आसान के रूप में

require 'benchmark' 
measurement = Benchmark.measure do 
    # your code goes here 
end 

प्रक्रिया में मुझे पता चला कि आप बेंचमार्क आउटपुट में कस्टम पंक्तियां जोड़ सकते हैं।

require 'benchmark' 

measurements = [] 
10.times { measurements << Benchmark.measure { 1_000_000.times { a = "1" } } } 

# measurements.sum or measurements.inject(0){...} does not work, since the 
# array contains Benchmark instances, which cannot be coerced into Fixnum's 
# Array#sum will work if you are using Rails 
sum = measurements.inject(nil) { |sum, t| sum.nil? ? sum = t : sum += t } 
avg = sum/measurements.size 

# 7 is the width reserved for the description "sum:" and "avg:" 
Benchmark.bm(7, "sum:", "avg:") do |b| 
    [sum, avg] 
end 

परिणाम निम्न तरह दिखेगा::

   user  system  total  real 
sum:  2.700000 0.000000 2.700000 ( 2.706234) 
avg:  0.270000 0.000000 0.270000 ( 0.270623) 
+0

मैं चाहता हूं कि 'आवश्यकता 'बेंचमार्क के लिए शॉर्टकट था; Benchmark.measure {...} ' – dolzenko

+0

मुझे समझ में नहीं आता है, उद्धृत हिस्सा बहुत छोटा है। आप क्या लेना चाहेंगे? (Pseduo- कोड की अनुमति है;) –

+0

निश्चित रूप से, शायद इससे कम नहीं हो सकता है, टाइपिंग को बचाने के लिए डिफ़ॉल्ट रूप से रूबी के साथ प्रदान किए गए कुछ शॉर्टकट की कमी का शोक था। + मैं हमेशा भूल जाता हूं कि यह 'माप' या 'बीएम' या 'बीएमबीएम' या कुछ और है :) – dolzenko

2

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

यह यह क्या अपने सिस्टम (linux, माणिक 1.8.7) पर रिपोर्ट है:

t = Process.times 
[ t.utime, t.stime ] #=> [0.0, 0.02] 
:

$ irb 
irb(main):001:0> t = Process.times 
=> #<struct Struct::Tms utime=0.01, stime=0.0, cutime=0.0, cstime=0.0> 

डॉक्स यह दिखाने हालांकि, इसलिए कुछ संस्करणों/कार्यान्वयन केवल पहले दो हो सकता है

लिनक्स पर अंतर्निहित कॉल के लिए times देखें।

class SysTimes 

    attr_accessor :user, :system 

    def initialize 
     times = Process.times 
     @user = times.utime 
     @system = times.stime 
    end 

    def -(other) 
     diff = SysTimes.new 
     diff.user = @user - other.user 
     diff.system = @system - other.system 
     diff 
    end 
end 

आप इसे अपने संदर्भ में अच्छी तरह से काम करने के लिए विचारों देना चाहिए:

यहाँ एक सच में भद्दा आवरण उस तरह की - का समर्थन करता है है।

+0

दुर्भाग्य से यह एक struct जो 'पर प्रतिक्रिया के लिए कैसे पता नहीं है -', इस प्रकार' समय = Process.times; उपयोगकर्ता, सिस्टम = Process.times - समय 'एक त्रुटि उठाएगा। हालांकि, पहले इस विधि के बारे में नहीं पता था और मुझे दृष्टिकोण पसंद है, क्योंकि मैं देख सकता हूं कि मेरा प्रोग्राम किसी भी समय कितना समय चल रहा है। :) आपके योगदान के लिए धन्यवाद! –

0

यह मणि आप इस प्रकार दोनों दुनिया (कस्टम समय माप और अंत में एक अच्छा उत्पादन) का सबसे अच्छा पाने के लिए इसका उपयोग कर सकते मदद कर सकता है: https://github.com/igorkasyanchuk/benchmark_methods

इस तरह कोई और अधिक कोड:

t = Time.now 
user.calculate_report 
puts Time.now - t 

अब आप कर सकते हैं:

benchmark :calculate_report # in class 

और बस फोन अपने विधि

user.calculate_report 
संबंधित मुद्दे