Производительность git status должна улучшиться с выходом Git 2.13 (второй квартал 2017 г.).
См. Commit 950a234 (14 апреля 2017 г.) Джеффа Хостетлера ( jeffhostetler
) .
(Объединено Junio C Hamano - gitster
- в коммите 8b6bba6 , 24 апреля 2017 г.)
> 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 г.) представит новую трассировку для измерения времени, затрачиваемого на операции с интенсивным индексированием.
См. Commit ca54d9b (27 января 2018 г.) Нгуен Тай Нгук Дуй ( pclouds
) .
(Объединено Junio C Hamano - gitster
- в фиксации 090dbea , 15 февраля 2018 г.)
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 г.) улучшается за счет git status
:
revision.c
: уменьшить количество запросов к базе данных объектов
В mark_parents_uninteresting()
разделе мы проверяем наличие объектного файла, чтобы увидеть, следует ли рассматривать фиксацию как проанализированную. В результате для фиксации устанавливается бит «проанализирован».
Измените условие, чтобы только проверить has_object_file()
, изменит ли результат анализируемый бит.
Когда локальная ветвь отличается от своей исходной ссылки, " git status
" будет вычислять количество вперед / назад.
Это использует paint_down_to_common()
и поражает mark_parents_uninteresting()
.
На копии репозитория Linux с локальным экземпляром «master» за удаленной ветвью « origin/master
» на ~ 60 000 коммитов мы обнаруживаем, что производительность « git status
» повысилась с 1,42 секунды до 1,32 секунды, с относительной разницей -7,0%.
Git 2.24 (3 квартал 2019 г.) предлагает еще одну настройку для повышения git status
производительности:
См. Коммит aaf633c , фиксацию c6cc4c5 , фиксацию ad0fb65 , фиксацию 31b1de6 , фиксацию b068d9a , фиксацию 7211b9e (13 августа 2019 г.) от Деррика Столи ( derrickstolee
) .
(Слияние Junio C Hamano - gitster
- in коммите f4f8dfe , 09 сентября 2019 г.)
repo-settings: создать настройку feature.manyFiles
feature.manyFiles
Установка подходит для сделок РЕПО с большим количеством файлов в рабочем каталоге.
Установив index.version=4
и core.untrackedCache=true
, такие команды, как 'git status
', должны улучшиться.
Но:
В Git 2.24 (4 квартал 2019 г.) кодовый путь, читающий index.version
конфигурацию, был нарушен в последнем обновлении, которое было исправлено.
См. Коммит c11e996 (23 октября 2019 г.) Деррик Столи ( derrickstolee
) .
(Объединено Junio C Hamano - gitster
- в коммите 4d6fb2b , 24 октября 2019 г.)
repo-settings
: читать int для index.version
Подписано: Деррик Столи
Несколько параметров конфигурации были объединены в repo_settings
структуру в ds / feature-macros, включая перемещение параметра конфигурации index.version в 7211b9e (" repo-settings
: объединить некоторые параметры конфигурации", 2019-08-13, Git v2.24.0-rc1 - слияние указано в партии № 0 ).
К сожалению, этот файл выглядел как много шаблонного, и, что явно является фактором перегрузки копирования и вставки, параметр конфигурации анализируется repo_config_ge_bool()
вместоrepo_config_get_int()
. Это означает, что параметр index.version = 4 не будет правильно зарегистрирован и вернется к версии 3 по умолчанию.
Я поймал это при включении v2.24.0-rc0 в кодовую базу VFS для Git, где нам действительно важно, чтобы индекс был в версии 4.
Это не было обнаружено кодовой базой, потому что проведенные проверки версии t1600-index.sh
недостаточно протестировали "базовый" сценарий. Здесь мы модифицируем тест, чтобы включить эти обычные настройки, которые не могут быть отменены features.manyFiles
или GIT_INDEX_VERSION
.
В то время как "по умолчанию" версия - 3, она понижена до версии 2 вdo_write_index()
когда в этом нет необходимости.