Bundle
Mi sembra un problema di caricamento del bundler. Consiglio di fare qualche misura in più. Usi 1 gemset per progetto o memorizzi tutto in 1 gemset (è vero se non ne usi nessuno)? Se hai molte gemme in 1 directory (cioè 1 gemset per tutte), alla fine rallenterà molto il bundler, poiché ha bisogno di attraversare più percorsi per fare il suo lavoro.
bundle | wc -l # how many gems bundler uses in your current project
gem list -q | wc -l # how many gems in your gemset
Se gem list -q | wc -l
riporta un valore abbastanza grande (ho 237
e tutto sembra normale per me), forse è necessario dividere le gemme installate in un gemset separato per progetto.
Effettua altre misurazioni con time
comando, cerca il real
valore, è la somma totale.
Per prima cosa, rimuovi il tuo bundled_rspec
wrapper, non è necessario con ultimo RVM
versioni.
Quindi misura il caricamento delle tue specifiche con e senza Bundler:
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`
Se time rspec -v
ti dà grandi numeri anche per progetti con Gemfile relativamente piccoli, è un problema di bundler.
Rotaie
Il collo di bottiglia successivo è solitamente Rails stesso. Prova a misurare un test che non carica Rails (cioè solo spec_helper
) e quindi testare con i binari (cioè con rails_helper
).
Non appena inizierai a vedere una grande differenza nei numeri, saprai dove hai un problema.
Primavera
Come soluzione rapida per migliorare le prestazioni delle rotaie è l'utilizzo di spring
gemma
. Se usi Rails 4.1+ Spring è già abilitato.
Per abilitare Spring per rspec
aggiungi al tuo Gemfile
gem 'spring-commands-rspec', group: :development
ed esegui
$ bundle install
$ spring binstub --all
L'ultimo comando genererà wrapper per tutti i binari supportati da Spring nel bin
del tuo progetto cartella (dai un'occhiata lì e non dimenticare di impegnarli). Dopodiché dovresti eseguire rspec
con bin/rspec
. La prima esecuzione sarà ancora lenta, ma tutte le corse successive dovrebbero essere abbastanza veloci poiché Rails sarà già caricato.