2008-08-27 19 views
29

रूबी पर रूबी में नियंत्रक कार्रवाई को प्रोफ़ाइल करने का सबसे अच्छा तरीका क्या है। वर्तमान में मैं puts Time.now में फेंकने की ब्रूट-फोर्स विधि का उपयोग कर रहा हूं जो मुझे लगता है कि एक बाधा होगी। लेकिन वास्तव में, वास्तव में गंदा लगता है। वहां एक बेहतर तरीका हो गया है।प्रोफ़ाइल एक रेल नियंत्रक कार्रवाई

उत्तर

9

बेंचमार्क मानक पुस्तकालय और रेल (इकाई, कार्यात्मक, एकीकरण) में उपलब्ध विभिन्न परीक्षणों का उपयोग करें। तो यहाँ हम सिर्फ बेंचमार्क पुस्तकालय के माध्यम से कुछ 100 बार, यह समय करते हैं, और सुनिश्चित करें कि यह समय की SOME_LIMIT राशि से कम ले लिया

def test_do_something 
    elapsed_time = Benchmark.realtime do 
    100.downto(1) do |index| 
     # do something here 
    end 
    end 
    assert elapsed_time < SOME_LIMIT 
end 

: यहाँ एक उदाहरण है।

आप इन लिंक को उपयोगी भी पा सकते हैं: Benchmark.realtime reference और Test::Unit reference। इसके अलावा, अगर आप 'पुस्तक पढ़ने' की बात में हैं, तो मैंने Agile Web Development with Rails से उदाहरण के लिए विचार उठाया, जो विभिन्न परीक्षण प्रकारों और प्रदर्शन परीक्षण पर थोड़ा सा बात करता है।

+3

इस उत्तर आपको बताता है कि सुनिश्चित करें कि आपके कार्रवाई जल्दी से पर्याप्त चल रहा है बनाने के लिए। यह आपको प्रोफाइलिंग में मदद नहीं करता है, जो यह पता लगा रहा है कि कार्रवाई का कौन सा हिस्सा सबसे अधिक समय ले रहा है। –

1

आप FiveRuns TuneUp सेवा एक कोशिश देने के लिए चाहते हो सकता है देख रहा है अच्छी तरह से लायक है, के रूप में यह वास्तव में नहीं बल्कि प्रभावशाली है रूपरेखा पर एक Railscast है। अस्वीकरण: मैं किसी भी तरह से पांचRuns से जुड़ा नहीं हूं, मैंने अभी इस सेवा को आजमाया है।

ट्यूनअप एक नि: शुल्क सेवा है जहां आप एक प्लगइन डाउनलोड करते हैं और जब आप अपना आवेदन चलाते हैं तो यह स्क्रीन के शीर्ष पर एक पैनल इंजेक्ट करता है जिसे विस्तृत प्रदर्शन मीट्रिक प्रदर्शित करने के लिए विस्तारित किया जा सकता है।

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

अंत में, आप सामुदायिक प्रदर्शन विश्लेषण और सलाह के लिए वैकल्पिक रूप से अपने प्रोफाइलिंग डेटा को पांचRuns साइट पर अपलोड कर सकते हैं।

+3

लिंक टूटा हुआ है (DNS समाप्त हो गया)। – mrzasa

39

मैंने थोड़ी देर पहले इस तकनीक को उठाया और इसे काफी आसान पाया है।

जब यह जगह हो, तो आप नियंत्रक को मारने वाले किसी भी URL पर ?profile=true जोड़ सकते हैं। आपकी कार्रवाई सामान्य रूप से चलती है, लेकिन ब्राउज़र में प्रस्तुत पृष्ठ वितरित करने के बजाय, यह एक विस्तृत, अच्छी तरह से स्वरूपित रूबी-प्रोफेसर पृष्ठ भेजेगा जो दिखाता है कि आपकी कार्रवाई ने अपना समय कहां बिताया था।

पहले, अपने Gemfile को माणिक प्रोफेसर जोड़ने के लिए, शायद विकास समूह में:

group :development do 
    gem "ruby-prof" 
end 

फिर अपने ApplicationController के लिए एक around filter जोड़ें:

around_filter :profile if Rails.env == 'development' 

def profile 
    if params[:profile] && result = RubyProf.profile { yield } 

    out = StringIO.new 
    RubyProf::GraphHtmlPrinter.new(result).print out, :min_percent => 0 
    self.response_body = out.string 

    else 
    yield 
    end 
end 

माणिक प्रोफेसर उत्पादन पढ़ना एक है एक कला का थोड़ा सा, लेकिन मैं इसे एक अभ्यास के रूप में छोड़ दूंगा।

अतिरिक्त नोट ScottJShea द्वारा: आप माप प्रकार जगह इस बदलना चाहते हैं: आवेदन नियंत्रक की प्रोफाइल विधि में

RubyProf.measure_mode = RubyProf::GC_TIME #example

if से पहले। आप ruby-prof page पर उपलब्ध मापों की एक सूची पा सकते हैं। इस लेखन के अनुसार memory और allocations डेटा स्ट्रीम दूषित प्रतीत होते हैं (see defect)।

+4

किसी के लिए यह भी नहीं कह रहा है, आपको अपने एप्लिकेशन नियंत्रक के शीर्ष पर "रूबी-प्रोफेसर" की आवश्यकता भी है। इसके अलावा, मेरे लिए, मुझे "self.response_body =" को "self.response.body =" में बदलना पड़ा (रेल 2.3.14) – Pavling

+0

उन बदलावों के लिए धन्यवाद। रेल 3.0 में 'प्रतिक्रिया_बीआई' जोड़ा गया था। और यदि आप बंडलर का उपयोग कर रहे हैं, तो आपको रूबी-प्रोफेसर की आवश्यकता नहीं होनी चाहिए, लेकिन मुझे खुशी है कि यह तकनीक रेल के पुराने संस्करण के लिए काफी अनुकूल थी। –

+0

टिप के लिए धन्यवाद, पैवलिंग। मैं रेल 2.3.14 का उपयोग कर रहा हूं, और इसे काम करने में परेशानी हो रही है। मुझे ग्राफ_html_printer.rb में "तर्कों की गलत संख्या (1 के लिए 0)" मिलती है: 98: 'full_name' में, इससे कोई फर्क नहीं पड़ता कि रूबी-प्रोफेसर का कौन सा संस्करण इंस्टॉल है। कोई विचार क्या हो सकता है? – jsarma

0

इस रेल 4.2.6 में काम करता है:

o=OpenStruct.new(logger: Rails.logger) 
    o.extend ActiveSupport::Benchmarkable 
    o.benchmark 'name' do 
     # ... your code ... 
    end 
संबंधित मुद्दे