git status
должно быть быстрее в Git 2.13 (2-й квартал 2017 г.), потому что:
По этому последнему пункту смотрите commit a33fc72 (14 апреля 2017) Джефф Хостетлер (jeffhostetler
) .
(Объединено с Junio C Hamano - gitster
- в commit cdfe138 , 24 апреля 2017 г.)
read-cache
: force_verify_index_checksum
Научите git пропускать проверку контрольной суммы SHA1-1 в конце индексного файла в verify_hdr()
, который вызывается из read_index()
, если не установлена глобальная переменная "force_verify_index_checksum
".
Научите fsck
принудительно выполнить эту проверку.
Проверка контрольной суммы предназначена для выявления повреждений диска, и для небольших проектов время, необходимое для вычисления SHA-1, не так существенно, но для гигантских репозиториев этот расчет добавляет значительное время каждому сотруднику.mmand.
Git 2.14 снова улучшает производительность состояния git за счет лучшего учета «1049 * неотслеживаемого кэша », который позволяет Git пропускать чтениенеотслеживаемые каталоги, если их данные stat
не изменились, используя поле mtime
структуры stat
.
См. Documentation/technical/index-format.txt
для получения дополнительной информации о неотслеживаемом кэше.
См. коммит edf3b90 (08 мая 2017 г.) от Дэвида Тернера (dturner-tw
) .
(объединено Junio C Hamano -- gitster
- в commit fa0624f , 30 мая 2017 г.)
Когда "git checkout
", "git merge
" и т. Д.манипулируя внутренним индексом, различные части информации в расширениях индекса отбрасываются из исходного состояния, поскольку обычно они не обновляются и не синхронизируются с операцией над основным индексом.
Расширение неотслеживаемого кэша теперь копируется в эти операции, что ускорит «состояние git» (при условии, что кэш должным образом признан недействительным).
В целомзапись в кеш также будет быстрее с Git 2.14.x / 2.15
См. commit ce012de , commit b50386c , commit 3921a0b (21 августа 2017 г.) Кевин Уилфорд (``) .
(объединено Junio C Hamano - gitster
- в commit 030faf2 , 27 августа 2017 г.)
Мы тратили больше, чем необходимо, выделяя и освобождая часть памяти при записи каждой записи индекса.
Это было оптимизировано.
[Это] позволит сэкономить где-то 3-7%, если в индексе более миллиона записей без снижения производительности при небольших репозиториях.
Обновление в декабре 2017 года: Git 2.16(Q1 2018) предложит дополнительное улучшение, на этот раз для git log
, так как код для итерации по loose объектные файлы только что были оптимизированы.
См. commit 163ee5e (04.12.2017) от Derrick Stolee (derrickstolee
) .
(Объединено Junio C Hamano - gitster
- в коммит 97e1f85 , 13 декабря 2017 г.)
sha1_file
: использовать strbuf_add()
вместо strbuf_addf()
Замените использование strbuf_addf()
на strbuf_add()
при перечислении незакрепленных объектов в for_each_file_in_obj_subdir()
.Поскольку мы уже проверяем длину и шестнадцатеричные значения строки перед использованием пути, мы можем предотвратить дополнительные вычисления, используя метод более низкого уровня.
Одним из потребителей for_each_file_in_obj_subdir()
является код сокращения.Сокращения OID ( идентификаторы объектов ) используют кэшированный список незакрепленных объектов (для каждого подкаталога объекта) для ускорения повторяющихся запросов, но при большом количестве незакрепленных объектов время загрузки в кэш-память значительно увеличивается.
Большинство репозиториев не имеют много незакрепленных объектов перед перепаковкой, но в случае GVFS (см. « Объявление GVFS (Git Virtual File System) »)в репозиториях могут быть миллионы незакрепленных объектов.
Профилирование производительности 'git log' в Git Для Windows в репозитории с поддержкой GVFS с ~ 2,5 миллионами незакрепленных объектов показало, что 12% процессорного времени былопотрачено на strbuf_addf()
.
Добавить новый тест производительности в p4211-line-log.sh
, который более чувствителен к этой загрузке в кеш.
Ограничив 1000 коммитов, мы больше напоминаем время ожидания пользователя при чтении историив пейджер.
Для копии репозитория Linux с двумя ~ 512 МБ пакетными файлами и ~ 572 КБ незакрепленных объектов запуск git log --oneline --parents --raw -1000 показал следующую производительность:
HEAD~1 HEAD
----------------------------------------
7.70(7.15+0.54) 7.44(7.09+0.29) -3.4%
Обновление за март 2018 года: Git 2.17 улучшится git status
еще немного: см. этот ответ .
Обновление:Git 2.20 (Q4 2018) добавляет Таблица смещения записи индекса (IEOT) , что позволяет git status
загружать индекс быстрее.
См. commit 77ff112 , commit 3255089 , commit abb4bb8 , коммит c780b9c , коммит 3b1d9e0 , коммит 371ed0d (10 октября 2018) Бен Пирт (benpeart
) .
См. коммит 252d079 (26 сентября 2018 г.) от Нгуен Тай Тай Нгуц Дуй (pclouds
) .
(Объединено Junio C Hamano - gitster
-- in commit e27bfaa , 19 октября 2018)
read-cache: загрузка записей кэша в рабочие потоки
Этот патч помогает устранитьстоимость процессора загрузки индекса с использованием таблицы смещения записей индекса (IEOT) для разделения загрузки и преобразования записей кэша между несколькими потоками параллельно.
Я использовал p0002-read-cache.sh
длясгенерируйте некоторые данные о производительности:
Test w/100,000 files reduced the time by 32.24%
Test w/1,000,000 files reduced the time by -4.77%
Обратите внимание, что в случае с 1 000 000 файлов многопоточность при разборе записей кэша не приводит к выигрышу в производительности.Это связано с тем, что стоимость анализа расширений индекса в этом репо намного превышает стоимость загрузки записей в кэш.
Это позволяет:
config
:добавить новый index.threads
параметр конфигурации
Добавить поддержку нового index.threads
параметра конфигурации, который будет использоваться для управления кодом потоков в do_read_index()
.
- Значение 0 скажет коду индекса автоматически определить правильное количество используемых потоков.
Значение 1 сделает код однопоточным. - Значение, большее 1, задает максимальное количество используемых потоков.
В целях тестирования этот параметр можно перезаписать, установив для переменной среды GIT_TEST_INDEX_THREADS=<n>
значениебольше 0.
Git 2.21 (Q1 2019) представляет новое улучшение с обновлением кэша свободных объектов , используемого для оптимизации поиска существования,который был обновлен.
См. коммит 8be88db (07 января 2019) и коммит 4cea1ce , коммит d4e19e5 , коммит 0000d65 (06 января 2019 г.) Рене Шарфе (rscharfe
) .
(Объединено Junio C Hamano - gitster
- in commit eb8638a , 18 января 2019 г.)
object-store
: использовать один oid_array
на каждый подкаталог для свободного кэша
Кэш свободных объектов заполненодин подкаталог за раз по мере необходимости.
Он сохраняется в oid_array
, который должен быть восстановлен после каждой операции добавления.
Так что при запросе широкогодиапазон объектов, частично заполненный массив должен быть восстановлен до 255 раз, что занимает в 100 раз больше времени, чем один раз.
Используйте один oid_array
для каждого подкаталога.
Это гарантирует, что записи имеютсортируется только один раз.
Он также избегает восьми шагов двоичного поиска для каждого поиска в кэше в качестве небольшого бонуса.
Кэш используется для проверки коллизий для заполнителей журнала %h
, %t
и %p
, и мы можем видеть, как изменения ускоряют их в репозитории с ок. 100 объектов в подкаталоге:
$ git count-objects
26733 objects, 68808 kilobytes
Test HEAD^ HEAD
--------------------------------------------------------------------
4205.1: log with %H 0.51(0.47+0.04) 0.51(0.49+0.02) +0.0%
4205.2: log with %h 0.84(0.82+0.02) 0.60(0.57+0.03) -28.6%
4205.3: log with %T 0.53(0.49+0.04) 0.52(0.48+0.03) -1.9%
4205.4: log with %t 0.84(0.80+0.04) 0.60(0.59+0.01) -28.6%
4205.5: log with %P 0.52(0.48+0.03) 0.51(0.50+0.01) -1.9%
4205.6: log with %p 0.85(0.78+0.06) 0.61(0.56+0.05) -28.2%
4205.7: log with %h-%h-%h 0.96(0.92+0.03) 0.69(0.64+0.04) -28.1%