Git 상태의 성능은 Git 2.13 (2017 년 2 분기)에서 개선 될 것입니다.
Jeff Hostetler ( )의 commit 950a234 (2017 년 4 월 14 일)를 참조하십시오 . (Merged by Junio C Hamano -- in commit 8b6bba6 , 24 Apr 2017)jeffhostetler
gitster
> string-list
: 재 할당시 ALLOC_GROW
매크로 사용string_list
배열을 ALLOC_GROW()
재 할당 할 때 string_list
단순히 32만큼 늘리기보다는 매크로를 사용하십시오 .
이것은 성능 최적화입니다.
매우 큰 리포지토리의 상태와 많은 변경 사항이있는 동안 총 실행 시간의 상당 부분이 wt_status.changes
어레이를 재 할당하는 데 소비 됩니다 .
이 변경으로 wt_status_collect_changes_worktree()
매우 큰 저장소에서 시간이 125 초에서 45 초로 단축됩니다.
또한 Git 2.17 (2018 년 2 분기)은 인덱스가 많은 작업에서 시간이 소비되는 위치를 측정하기위한 새로운 추적을 도입합니다.
Nguyễn Thái Ngọc Duy ( )의 commit ca54d9b (2018 년 1 월 27 일)를 참조하십시오 . (Merged by Junio C Hamano -- in commit 090dbea , 15 Feb 2018)pclouds
gitster
trace
: 인덱스가 많은 작업에서 시간이 소요되는 위치 측정
알려진 모든 무거운 코드 블록이 측정됩니다 (객체 데이터베이스 액세스 제외). 이는 최적화가 효과적인지 여부를 식별하는 데 도움이됩니다.
최적화되지 않은 git-status는 다음과 같습니다.
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'
동일한 Git 2.17 (2018 년 2 분기)이 다음 git status
과 같이 개선 되었습니다.
revision.c
: 개체 데이터베이스 쿼리 줄이기
에서는 mark_parents_uninteresting()
커밋을 파싱 된 것으로 처리해야하는지 확인하기 위해 객체 파일이 있는지 확인합니다. 결과는 커밋에 "파싱 된"비트를 설정하는 것입니다.
has_object_file()
결과가 구문 분석 된 비트를 변경 하는지 확인하도록 조건을 수정하십시오 .
로컬 브랜치가 업스트림 참조와 다른 경우 " git status
"는 앞 / 뒤 카운트를 계산합니다.
이것은 사용 paint_down_to_common()
하고 mark_parents_uninteresting()
.
origin/master
~ 60,000 개 커밋에 의해 원격 브랜치 ""뒤에 "master"의 로컬 인스턴스가있는 Linux 리포지토리의 복사본에서 " "의 성능이 git status
1.42 초에서 1.32 초로, 상대적 차이는 -7.0 %로 떨어졌습니다.
Git 2.24 (2019 년 3 분기)는 git status
성능 향상을위한 또 다른 설정을 제안 합니다.
참조 aaf633c 커밋 , c6cc4c5 커밋 , ad0fb65 커밋 , 31b1de6 커밋 , b068d9a 커밋 , 7211b9e 커밋 에 의해 (2019년 8월 13일) 데릭 Stolee을 ( derrickstolee
) .
(Merged by Junio C gitster
Hamano -- in commit f4f8dfe , 09 Sep 2019)
repo-settings : feature.manyFiles 설정 생성
이 feature.manyFiles
설정은 작업 디렉토리에 많은 파일이있는 저장소에 적합합니다. 및
을 설정 하면 ' ' 와 같은 명령 이 향상됩니다.index.version=4
core.untrackedCache=true
git status
그러나:
Git 2.24 (2019 년 4 분기)에서 index.version
구성 을 읽는 코드 경로 가 수정 된 최근 업데이트로 인해 손상되었습니다.
Derrick Stolee ( )의 commit c11e996 (2019 년 10 월 23 일)을 참조하십시오 . (Merged by Junio C Hamano -- in commit 4d6fb2b , 24 Oct 2019)derrickstolee
gitster
서명자 : Derrick Stolee
7211b9e ( " : 일부 구성 설정 통합", 2019-08-13, Git v2.24.0-rc1 repo_settings
에서 "index.version"구성 설정 이동 포함) 여러 구성 옵션이 ds / feature-macros 의 구조체 로 결합되었습니다. - 일괄 # 0에 나열된 병합 ).repo-settings
불행하게도, 그 파일은 상용구의 많은처럼 보였다과 무슨 일이 명확하게 구성 설정과 구문 분석 복사 - 붙여 넣기 과부하의 요소입니다 repo_config_ge_bool()
대신 repo_config_get_int()
. 즉, "index.version = 4"설정이 올바르게 등록되지 않고 기본 버전 인 3으로 되돌아갑니다.
v2.24.0-rc0을 Git 코드베이스 용 VFS에 통합하는 동안이 문제를 포착했습니다. 여기서 색인이 버전 4에 있다는 사실을 정말 신경 씁니다.
버전 검사 t1600-index.sh
가 "기본"시나리오를 충분히 테스트하지 않았기 때문에 이것은 코드베이스에 의해 포착 되지 않았습니다. 여기서는 features.manyFiles
또는에 의해 재정의되지 않도록 이러한 일반 설정을 포함하도록 테스트를 수정합니다 GIT_INDEX_VERSION
.
"기본"버전은 3이지만 do_write_index()
필요하지 않은 경우 버전 2로 강등됩니다 .