2010-12-16 8 views
14

Kiedy biegnępowolne szyny stos

serwer szyny

lub

grabie -T

lub jakiś inny skrypt szyny, to zajmuje dużo czas, około 1 minuta. Jaki jest najlepszy sposób określenia, co jest tak powolne? Jak można poprawić prędkość?

Rails v 3.0.3 bieg koryta Ruby 1.9.2 (RVM) - Linux

+1

Na jakiej platformie jesteś? Linux? Prochowiec? Proszę również zdefiniować "dużo czasu" ... 20 sekund? 2 minuty? –

+0

Tak, właśnie zaczynam tutorial Railsowy z czystą instalacją Rails 3.1.1 na Windows 7 i 'rake-T' trwa 11 sekund do wykonania! –

Odpowiedz

15

To przeszkadza mi również, ponieważ mam włączony do szyn 3.

do drugiego pytania: Znalazłem przeszukując strukturę, w której inicjalizatorzy zajmują mniej więcej połowę czasu prostego wywołania rake lub rails, zanim faktycznie zacznie on wykonywać swoje zadanie.

Jeśli umieścisz te proste linie czasowe do pętli połączeń initializer w $GEM_PATH/gems/railties-3.0.3/lib/rails/initializable.rb (lub piggy-back, jeśli chcesz):

def run_initializers(*args) 
    return if instance_variable_defined?(:@ran) 
    t0 = Time.now 
    initializers.tsort.each do |initializer| 
    t = Time.now 
    initializer.run(*args)   
    puts("%60s: %.3f sec" % [initializer.name, Time.now - t]) 
    end 
    puts "%60s: %.3f sec" % ["for all", Time.now - t0] 
    @ran = true 
end 

EDIT: Albo na railties 4.2.1:

def run_initializers(group=:default, *args) 
    return if instance_variable_defined?(:@ran) 
    t0 = Time.now 
    initializers.tsort.each do |initializer| 
    t = Time.now 
    initializer.run(*args) if initializer.belongs_to?(group) 
    puts("%60s: %.3f sec" % [initializer.name, Time.now - t]) 
    end 
    puts "%60s: %.3f sec" % ["for all", Time.now - t0] 
    @ran = true 
end 

... możesz śledzić, co się stanie. W moim systemie, którym jest 2.4 Core 2 Duo MacBook, inicjalizatory zajmują około 7 sekund.

Jest kilka szczególnie wolnych w moim systemie. Kiedy filtrowanie wszystko poniżej sekundy, otrzymuję ten wynik w moim systemie:

   load_active_support: 1.123 sec 
active_support.initialize_time_zone: 1.579 sec 
         load_init_rb: 1.118 sec 
       set_routes_reloader: 1.291 sec 

Jestem pewny kogoś (czy to ja?) Zajmie trochę czasu, aby rozpocząć tam i optymalizacji.

+1

[Rails 1.9.3-p327] (http://rubyinstaller.org/) poprawia to _a lot_. – lambinator

+2

@lambinator Czy masz na myśli ** Ruby ** 1.9.3-p327? – evanrmurphy

0

Użyłem porady robokopp tutaj, aby odkryć, że większość czasu była używana w krokach build_middleware_stack i load_config_initializers dla mnie. Dzieje się tak, ponieważ korzystam z klejnotu omniauth, który dodaje middleware i może ma ciężkie kroki inicjowania. Jestem na Railsach 3.1.rc1, a inicjalizacja trwa prawie 13 sekund (jestem na ruby ​​1.9.2p180).

Nawet w przypadku zupełnie nowej aplikacji szynowej 3.1.rc1 inicjalizacja trwa ~ 3,6 sekundy, a maksymalny czas zajmuje load_config_initializers.

Sugeruję więc, abyś szukał klejnotów/własnego kodu, które mają ciężkie inicjatory lub dodają zbyt wiele middleware.

1

Jednym z rozwiązań, których używam jest wstępne ładowanie środowiska szyn z numerem rails-sh. W ten sposób tylko pierwsze polecenie rails/rake jest wolne, a reszta jest dość szybka. Napisał pełniejszą odpowiedź na to w this question.

Innym sposobem, który próbowałam ostatnio i jest kompatybilny z pierwszym, jest instalowanie poprawionego rubinu (z rvm lub rubyenv lub ze źródła) i dostosowywanie zmiennych środowiskowych (patrz odpowiedź @ stwienert). Patchy sokoła i szyny railsexpress wydają się osiągać znaczącą wydajność w Rubim 1.9. Sprawdź rvm/rubyenv, jak zainstalować z nimi poprawione rubiny.

13

Nasze Rails 3.1 czas startowy został prawie 1 minuty (o wiele klejnotów)

Wtedy dowiedzieliśmy się o niektórych Ruby 1.9.3 opcji tuningowych na reddit: http://www.reddit.com/r/ruby/comments/wgtqj/how_i_spend_my_time_building_rails_apps/c5daer4

export RUBY_HEAP_MIN_SLOTS=800000 
export RUBY_HEAP_FREE_MIN=100000 
export RUBY_HEAP_SLOTS_INCREMENT=300000 
export RUBY_HEAP_SLOTS_GROWTH_FACTOR=1 
export RUBY_GC_MALLOC_LIMIT=79000000 

umieścić ten w twoim środowisku powłoki/profilu/bashrc i gotowe.

Poprawiliśmy nasz start z 1 minuty do 9 sekund