Wydajność statusu git powinna ulec poprawie w Git 2.13 (Q2 2017).
Zobacz commit 950a234 (14 kwietnia 2017) autorstwa Jeffa Hostetlera ( jeffhostetler
) .
(Scalone przez Junio C Hamano - gitster
- w zatwierdzeniu 8b6bba6 , 24 kwietnia 2017)
> string-list
: użyj ALLOC_GROW
makra podczas ponownego przydzielaniastring_list
Użyj ALLOC_GROW()
makra podczas ponownego przydzielania string_list
tablicy, zamiast po prostu zwiększać ją o 32.
Jest to optymalizacja wydajności.
W przypadku statusu bardzo dużego repozytorium i wielu zmian znaczny procent całkowitego czasu wykonywania jest poświęcany na ponowne przydzielanie wt_status.changes
macierzy .
Ta zmiana skraca czas wt_status_collect_changes_worktree()
z 125 sekund do 45 sekund w moim bardzo dużym repozytorium.
Dodatkowo, Git 2.17 (Q2 2018) wprowadzi nowy ślad, do pomiaru czasu spędzanego na operacjach z dużą liczbą indeksów.
Zobacz commit ca54d9b (27 stycznia 2018) autorstwa Nguyễn Thái Ngọc Duy ( pclouds
) .
(Scalone przez Junio C Hamano - gitster
- w zatwierdzeniu 090dbea , 15 lutego 2018 r.)
trace
: miara, gdzie czas jest spędzany na operacjach z dużą liczbą indeksów
Mierzone są wszystkie znane ciężkie bloki kodu (z wyjątkiem dostępu do obiektowej bazy danych). Powinno to pomóc określić, czy optymalizacja jest skuteczna, czy nie.
Niezoptymalizowany status gita dałby coś takiego jak poniżej:
0.001791141 s: read cache ...
0.004011363 s: preload index
0.000516161 s: refresh index
0.003139257 s: git command: ... 'status' '--porcelain=2'
0.006788129 s: diff-files
0.002090267 s: diff-index
0.001885735 s: initialize name hash
0.032013138 s: read directory
0.051781209 s: git command: './git' 'status'
Ten sam Git 2.17 (Q2 2018) poprawia się git status
dzięki:
revision.c
: redukcja zapytań do bazy danych obiektów
W programie mark_parents_uninteresting()
sprawdzamy istnienie pliku obiektowego, aby zobaczyć, czy powinniśmy traktować zatwierdzenie jako przeanalizowane. Rezultatem jest ustawienie bitu „przeanalizowanego” w zatwierdzeniu.
Zmodyfikuj warunek, aby sprawdzić tylko, has_object_file()
czy wynik zmieni przeanalizowany bit.
Kiedy lokalna gałąź różni się od jej odniesienia nadrzędnego, " git status
" obliczy liczniki z wyprzedzeniem / opóźnieniem.
To używa paint_down_to_common()
i uderza mark_parents_uninteresting()
.
Na kopii repozytorium Linuksa z lokalną instancją „master” za zdalną gałęzią „ origin/master
” przy ~ 60 000 zatwierdzeń, okazało się, że wydajność „ git status
” spadła z 1,42 sekundy do 1,32 sekundy, przy względnej różnicy -7,0%.
Git 2.24 (Q3 2019) proponuje inne ustawienie poprawiające git status
wydajność:
Zobacz commit aaf633c , commit c6cc4c5 , commit ad0fb65 , commit 31b1de6 , commit b068d9a , commit 7211b9e (13 sierpnia 2019) autorstwa Derrick Stolee ( derrickstolee
) .
(Scalone przez Junio C Hamano - gitster
- w zatwierdzeniu f4f8dfe , 09 września 2019)
repo-settings: utwórz ustawienie feature.manyFiles
To feature.manyFiles
ustawienie jest odpowiednie dla repozytoriów z wieloma plikami w katalogu roboczym.
Ustawiając index.version=4
i core.untrackedCache=true
, polecenia takie jak „ git status
” powinny ulec poprawie.
Ale:
W Git 2.24 (Q4 2019) ścieżka kodu odczytująca index.version
konfigurację została zerwana podczas niedawnej aktualizacji, która została poprawiona.
Zobacz commit c11e996 (23 października 2019) autorstwa Derrick Stolee ( derrickstolee
) .
(Scalone przez Junio C Hamano - gitster
- w zatwierdzeniu 4d6fb2b , 24 października 2019)
repo-settings
: przeczytaj int dla index.version
Podpisał: Derrick Stolee
Kilka opcji konfiguracyjnych zostało połączonych w repo_settings
strukturę w ds / feature-macros, w tym przeniesienie ustawienia konfiguracyjnego „index.version” w 7211b9e („ repo-settings
: Consolidate some config settings”, 2019-08-13, Git v2.24.0-rc1 - scalenie wymienione w partii nr 0 ).
Niestety, ten plik wyglądał jak wiele standardowych szablonów i co jest oczywistym czynnikiem przeciążenia kopiuj-wklej, ustawienie konfiguracyjne jest analizowane za pomocą repo_config_ge_bool()
zamiast repo_config_get_int()
. Oznacza to, że ustawienie „index.version = 4” nie rejestrowałoby się poprawnie i przywracałoby domyślną wersję 3.
Złapałem to podczas włączania wersji 2.24.0-rc0 do bazy kodu VFS dla Git, gdzie naprawdę zależy nam, aby indeks był w wersji 4.
Nie zostało to przechwycone przez bazę kodów, ponieważ sprawdzanie wersji wprowadzone w t1600-index.sh
nie przetestowało wystarczająco scenariusza „podstawowego”. Tutaj modyfikujemy test, aby uwzględnić te normalne ustawienia, aby nie były zastępowane przez features.manyFiles
lub GIT_INDEX_VERSION
.
Chociaż „domyślną” wersją jest 3, jest ona obniżana do wersji 2, do_write_index()
gdy nie jest to konieczne.