Bundler
Wygląda na to, że mam problem z ładowaniem Bundlera. Zalecam wykonanie kilku dodatkowych pomiarów. Czy używasz 1 gemset na projekt, czy przechowujesz wszystko w 1 gemset (to prawda, jeśli nie używasz żadnego)? Jeśli masz dużo klejnotów w 1 katalogu (tj. 1 zestaw klejnotów dla wszystkich), w końcu znacznie spowolni to pakowanie, ponieważ musi przejść więcej ścieżek, aby wykonać swoje zadanie.
bundle | wc -l # how many gems bundler uses in your current project
gem list -q | wc -l # how many gems in your gemset
Jeśli gem list -q | wc -l
zgłasza dość dużą wartość (mam 237
i wszystko wydaje mi się normalne), być może musisz podzielić zainstalowane klejnoty na osobny zestaw klejnotów na projekt.
Wykonaj więcej pomiarów z time
polecenie, poszukaj real
wartość, to całkowita suma.
Najpierw usuń swój bundled_rspec
wrapper, nie jest potrzebny z najnowszym RVM
wersje.
Następnie zmierz ładowanie rspec z pakietem i bez niego:
time rspec -v # with implicit bundler loading, rubygems-bundler gem is in use
time NOEXEC_DISABLE=1 rspec -v # without bundler, disable rubygems-bundler gem for this call`
Jeśli time rspec -v
daje duże liczby nawet dla projektu ze stosunkowo małym plikiem Gemfile, jest to problem z pakietem.
Szyny
Kolejnym wąskim gardłem są zwykle same Railsy. Spróbuj zmierzyć jeden test, który nie ładuje Railsów (np. po prostu spec_helper
), a następnie przetestuj z rails (np. z rails_helper
).
Jak tylko zaczniesz widzieć dużą różnicę w liczbach, będziesz wiedział, gdzie masz problem.
Wiosna
Jako szybkie rozwiązanie poprawiające wydajność szyn jest użycie spring
klejnot
. Jeśli używasz Rails 4.1+, Spring jest już włączony.
Aby włączyć Spring dla rspec
dodaj do swojego Gemfile
gem 'spring-commands-rspec', group: :development
i uruchom
$ bundle install
$ spring binstub --all
Ostatnie polecenie wygeneruje opakowania dla wszystkich plików binarnych obsługiwanych przez sprężynę w bin
twojego projektu folder (zajrzyj tam i nie zapomnij ich zatwierdzić). Następnie powinieneś uruchomić rspec
z bin/rspec
. Pierwsze uruchomienie będzie nadal wolne, ale wszystkie kolejne uruchomienia powinny być wystarczająco szybkie, ponieważ Railsy będą już załadowane.