Przyśpiesz bundle install jednym trickiem.

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.]