Wiedzieliście, że bundler może ściągać i instalować gemy równolegle?
To prawda, używając opcji --jobs
dla bundle install
możecie ustalić dowolną liczbę gemów, która ma być równolegle pobierana i instalowana. Na przykład, żeby użyć czterech równoległych zadań możecie uruchomić:
bundle install --jobs=4
W ramach bonusu powiem wam, że nie musicie nawet pamiętać, żeby za każdym razem używać opcji --jobs
. Możecie to ustawić w globalnej konfiguracji bundlera w formie takiej komendy:
bundle config --global jobs 4
CZY TO RZECZYWIŚCIE POMAGA?
Odkryłem to wszystko niedawno, mimo że było to dostępne już w wersji bundlera 1.4.0 i chciałem sprawdzić czy faktycznie będzie to użyteczne. Pobieranie i instalowanie gemów równolegle brzmi cudownie, ale musiałem to przetestować, żeby mieć pewność.
Szukałem dużego projektu w Rails, żeby na nim wypróbować nowe rozwiązanie. Natknąłem się wtedy na GitLab Community Edition app i sklonowałem projekt. Nie musiałem go tak naprawdę uruchamiać, testowałem tylko czas instalacji gemów.
Szukałem dużej aplikacji. rake stats
dało wynik 172 kontrolerów, 208 modeli i 86 019 linijek kodu. W Gemfile było 197 zależności gemów, co w sumie przekładało się na 369 gemów. Sprawdziłem też Discourse i Diaspora, ale GitLab z pewnością miał największą liczbę gemów, więc nadawał się idealnie do sprawdzenia mojej teorii.
Uruchomiłem time bundle install --path=./gems --quiet --force --jobs=n
pięć razy dla n równego 1 i 4. Mediana dla każdego z nich była następująca:
time bundle install --path=./gems --quiet --force --jobs=1
real 4m39.836s
user 1m59.692s
sys 0m50.291s
time bundle install --path=./gems --quiet --force --jobs=4
real 2m55.857s
user 2m0.005s
sys 0m47.897s
Te testy przeprowadziłem na MacBooku Pro z procesorem 2,5 GHz Intel Core i7 i 16GB RAM.
Z tymi rezultatami możemy zobaczyć, że równoległe instalowanie gemów dla GitLaba używając 4 procesów roboczych było szybsze około 1,6 razy.
Powinniście przeprowadzić własne testy z waszymi ustawieniami, żeby zobaczyć czy naprawdę zaoszczędzicie czas instalując gemy równolegle. Przeprowadzono badanie dotyczące najlepszej liczby zadań. Na przyszłość, ustaliłem domyślną liczbę zadań – 4.
DLACZEGO TO NIE JEST DOMYŚLNE?
Pewnie zastanawiacie się dlaczego Bundler nie włącza domyślnie instalacji równoległej. Rzut oka na komentarze w source code wszystko wyjaśnia.
# the order that the resolver provides is significant, since
# dependencies might affect the installation of a gem.
# that said, it's a rare situation (other than rake), and parallel
# installation is SO MUCH FASTER. so we let people opt in.
CZYTANIE DOKUMENTACJI
Na samym końcu chciałbym zwrócić uwagę, że czytanie dokumentacji, nawet do projektów, których używacie na co dzień, może skutkować odkryciem interesujących opcji, o których istnieniu nie wiedzieliście. Sam Bundler jest pełen przydatnych komend i opcji. Sprawdźcie jakie macie możliwości używając bundle pristine
, bundle gem
, oraz bundle outdated
.
Miejcie oko na interesujące opcje w oprogramowaniu, którego używacie i instalujcie gemy szybciej!
Oryginalny tekst: Speed Up Bundle Install With This One Trick [przyp. red.]