2011-01-19 15 views
44

मुझे आश्चर्य है कि मेरे कंसोल लोड समय को गति देने के लिए कोई अपेक्षाकृत आसान तरीका है, जो 30 सेकंड तक पहुंचने वाला है। मेरे पास बहुत से उप-वर्ग हैं जिनकी विधियां reload! से प्रभावित नहीं लगती हैं, इसलिए मैं कंसोल खोलने और बंद करने के लिए बहुत कुछ समाप्त करता हूं। आईआरबी बिजली जल्दी लोड करता है।रेल 3 - कंसोल की गति लोड हो रहा है समय

क्या मेरे पास बहुत सारे रत्न हैं? लोड लोड समय के बारे में मैं कैसे जा सकता हूं ताकि मैं देख सकूं कि अधिकतर समय क्या हो रहा है? जैसा कि आप देख सकते हैं, मैंने पहले ही देव-बूस्ट मणि का कोई फायदा नहीं लिया है। ऐप यात्री में ठीक है, यह केवल कंसोल लोडिंग है जो मेरे बाहर बकवास करता है। 2.4 गीगाहर्ट्ज और 4 जीबी रैम के साथ एमबीपी ओएसएक्स 10.6.6 पर चल रहा है। आरवीएम का उपयोग नहीं कर रहा है।

संस्करण:

Ovid$ rails -v 
Rails 3.0.3 
Ovid$ ruby -v 
ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10] 

मेमोरी:

Ovid$ vm_stat 
Mach Virtual Memory Statistics: (page size of 4096 bytes) 
Pages free:       118818. 
Pages active:      341320. 
Pages inactive:      99490. 
Pages speculative:     310576. 
Pages wired down:     112527. 
"Translation faults":    23097323. 
Pages copy-on-write:    1270961. 
Pages zero filled:    13836659. 
Pages reactivated:      36. 
Pageins:       165761. 
Pageouts:        0. 
Object cache: 28 hits of 760846 lookups (0% hit rate) 

Gemfile:

source 'http://rubygems.org' 

gem 'rails', '3.0.3' 
gem 'mysql2' 
gem 'foreigner' 
gem 'haml' 
gem 'capistrano' 
gem 'nokogiri' 

#web services 
gem 'yammer4r' 
gem 'ruby-freshbooks' 

#authentication gems from nifty generator 
gem "bcrypt-ruby", :require => "bcrypt" 
gem "mocha", :group => :test 
gem 'authlogic' 

#dev 
group :development do 
    gem 'rails-dev-boost', :git => 'git://github.com/thedarkone/rails-dev-boost.git', :require => 'rails_development_boost' 
end 

#testing 
group :test do 
    gem 'database_cleaner' 
    gem 'cucumber-rails' 
    gem 'cucumber' 
    gem 'rspec-rails' 
    gem 'spork' 
    gem 'launchy' 
    gem 'machinist' 
    gem 'faker' 
    gem 'capybara' 
end 

आपको बहुत बहुत धन्यवाद!

+0

अच्छा सवाल! हमें बताएं कि आपको क्या मिलता है। :) –

+0

http://www.ruby-forum.com/topic/914379 – pendevere

उत्तर

1

मैं केवल आपके प्रयोगशाला कोट को डालने और इस मुद्दे को हल करने का सुझाव दे सकता हूं। देखें कि क्या आपकी सभी मणि आवश्यकताओं को टिप्पणी करने से चीजों को गति मिलती है (संभवतः उन रत्नों पर निर्भर कोड के टुकड़ों को टिप्पणी करने में भी शामिल होगा)। यदि ऐसा है, तो एक समय में आधा टिप्पणी करें और इसी तरह।

क्षमा करें यह वास्तविक जवाब नहीं है .. उदाहरण के लिए, आप इसे rails runner और नो-ऑप स्क्रिप्ट के साथ आमंत्रित करते हुए रूबी-प्रोफेसर का प्रयास कर सकते हैं।

मैं पर मेरे मैक ruby-prof script/rails runner 'nil' की कोशिश की, लेकिन यह सिर्फ दुर्घटनाग्रस्त हो :-)

संपादित

आप अपने अनुप्रयोग के लिए Git उपयोग कर रहे हैं आप भी इसे आदेश द्विभाजित और अगर देखना है की कोशिश कर सकते प्रतीत होता है सामान्य ब्लोट के बजाए चीजें धीमी हो गईं, उस समय एक विशिष्ट बिंदु है।

0

पुनः लोड करें! कुछ समय के लिए एक मुद्दा रहा है। this पर एक नज़र डालें। कुछ पैच हैं जिनका आप उपयोग कर सकते हैं और कुछ सुझाव हैं कि आप अपने मुद्दे के आसपास कैसे पहुंच सकते हैं।

रीलोड विधि स्वयं इस तरह दिखती है।

# reloads the environment 
def reload!(print=true) 
    puts "Reloading..." if print 
    ActionDispatch::Callbacks.new(lambda {}, false).call({}) 
    true 
end 

आप इसे इस विधि में हमेशा ओवरराइड करने के लिए पर्यावरण को जोड़ सकते हैं और आपको आवश्यक रीलोड को मजबूर कर सकते हैं।

यह मेरे लिए काम किया है तो हमें बताएं कि यह आपके लिए काम करता है या नहीं। शुभकामनाएं।

+0

पर भी पोस्ट किया गया सुझाव के लिए धन्यवाद - मैंने धागे में आपके पैच और दूसरे, लंबे पैच दोनों की कोशिश की। लेकिन मुझे कोई भाग्य नहीं मिला है। आपका मतलब है कि लाइन एक्शनडिस्चैच :: Callbacks.new (Proc.new {}, false) .call (RAILS_ENV), सही कहनी चाहिए? – pendevere

58

मुझे अंत में बेंचमार्क का उपयोग करके मेरी स्टार्टअप बाधाएं मिलीं। विशेष रूप से, बंडलर मणि को और lib/बंडलर/runtime.rb में नेविगेट, लाइन है कि Kernel.require करता है खोजने के लिए और इस तरह लपेट:

puts Benchmark.measure("require #{file}") { 
    Kernel.require file 
}.format("%n: %t %r") 

आप 'बेंचमार्क' में कहीं आवश्यकता जोड़ना पड़े आपका ऐप, जैसे config/boot.rb में। यह आपको दिखाएगा कि प्रत्येक मणि की आवश्यकता के लिए कितना समय लगता है। मैं गारंटी नहीं दे सकता कि आपके परिणाम मेरा मिलान करेंगे, लेकिन मेरे पास कुछ रत्न थे जो अधिकतर के लिए उप-मिलीसेकंड की तुलना में लोड करने के लिए एक सेकंड ले रहे थे।कुछ ऐसे रत्न थे जिन्हें मुझे विकसित करने की आवश्यकता नहीं थी, लेकिन मुझे विकास पर्यावरण में कुछ कार्यों की आवश्यकता थी, उदा। capistrano, कंधे। मैंने स्टार्टअप (प्रारंभकर्ता, आदि) के अन्य क्षेत्रों को बेंचमार्क किया, लेकिन कोई महत्वपूर्ण बाधा नहीं मिली।

मैंने अभी तक ऐप को कॉन्फ़िगर करने के लिए एक साफ तरीका नहीं निकाला है, केवल उन कार्यों के लिए लोड करें जहां उन्हें वास्तव में आवश्यकता है। संभवतः, मैं एक पर्यावरण कहला सकता हूं: स्टार्टअप के लिए तेज़ी से और RAILS_ENV = तेजी से रेल एस/सी का उपयोग करें जब मुझे पता है कि मुझे उन रत्नों की आवश्यकता नहीं है। फिर जेमफाइल में, मैं समूह का उपयोग कर सकता था: कुछ मामलों में उन रत्नों को बाहर करने के लिए तेज़ी से।

सभी ने कहा, मेरे लिए सबसे बड़ी स्टार्टअप परेशानियों को पूरे वातावरण को रेक रेक चलाने के लिए लोड करना पड़ रहा है। मैं शायद इसके लिए अधिकतर रत्नों को बाहर कर सकता हूं, लेकिन जेमफाइल गन्दा हो जाना शुरू कर देगा, इसलिए मुझे नहीं पता कि यह इसके लायक है या नहीं।

+7

यह हैक कुछ वाकई दिलचस्प डेटा देता है। मुझे आश्चर्य है कि कितने मणि लेखकों को पता चलता है कि उनके काम लंबे समय तक कितने योगदान दे रहे हैं। –

+1

याद रखें: उस फ़ाइल में कहीं भी 'बेंचमार्क' की आवश्यकता है – makevoid

+0

यह आउटपुट कहां दिखाता है? मैं लॉग फ़ाइल हालांकि होगा लेकिन मुझे कुछ भी नहीं दिख रहा है। यहां तक ​​कि एक सामान्य रखता है और सत्यापित किया गया है कि मैं सही runtime.rb संशोधित कर रहा हूँ। मैं क्या खो रहा हूँ? –

7

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

gem 'jammit', :require => nil 

मैंने इस मुद्दे को एक मीटिंग में भी संबोधित किया। यह (इस पैच की टिप्पणी देखें: https://gist.github.com/1008945) गहरे लाल रंग का 1.9.2 में एक बग हो रहा है

आप पैचिंग उसे ठीक कर सकते अपने 1.9.2 सार मैं सिर्फ जुड़ा हुआ या 1.9.2-head या 1.9.3-head के उन्नयन द्वारा।

+3

एक अच्छा विचार की तरह लगता है। हम सक्रियडमिन और omniauth जैसे रत्नों को लोड करने में समय ले रहे हैं और सोच रहे हैं कि किसी भी कार्यक्षमता को प्रभावित किए बिना बाद में लोड करने की सबसे अच्छी रणनीति क्या है। रेलों को पूरी तरह से लोड होने के बाद मैन्युअल रूप से उन लोगों की आवश्यकता के लिए सबसे अच्छी जगह कहां है? रेल के लिए – gingerlime

20

थोड़ा फार्म का है कि कॉपी-pastable है अनुकूलित, सभी लपेटता आवश्यकता है, और sortable उत्पादन प्रदान करता है:

# Add this to the top of boot.rb 
require 'benchmark' 
def require(file) 
    puts Benchmark.measure("") { 
    super 
    }.format("%t require #{file}") 
end 

तो फिर तुम उन्हें देखने के लिए कोई-op पर अमल कर सकते हैं:

rails runner 1 

या उन्हें सॉर्ट और शीर्ष 50:

rails runner 1 | sort -nr | head -n 50 
+2

2.3/रूबी 1.8.7 'स्क्रिप्ट/धावक 1' – professormeowingtons

+2

का उपयोग करें आपने हमारे 2 दिन बचाए :) – Jayesh

1

यह निश्चित रूप से आपके कोड को साफ करने और बाधाओं की पहचान करने के बारे में है , लेकिन एक बार जब आप बचत कर लेते हैं तो ज़ीउस की तरह कुछ करने के लायक है जो आपके देव काल को तेज करता है।

gem install zeus 

https://github.com/burke/zeus (दस्तावेज़)

यह कीड़े के बिना नहीं है और कभी कभी एक रिबूट की आवश्यकता होती है लेकिन मैं अभी भी तेजी से सर्वर और कंसोल से विकास के दिनों में एक समग्र वृद्धि देख रहा हूँ छोटे कोड में परिवर्तन के बाद रिबूट।

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