El rendimiento del estado de git debería mejorar con Git 2.13 (segundo trimestre de 2017).
Consulte la confirmación 950a234 (14 de abril de 2017) de Jeff Hostetler ( jeffhostetler
) .
(Combinado por Junio C Hamano - gitster
- en el compromiso 8b6bba6 , 24 de abril de 2017)
> string-list
: use ALLOC_GROW
macro al reasignarstring_list
Utilice ALLOC_GROW()
macro al reasignar una string_list
matriz en lugar de simplemente aumentarla en 32.
Esta es una optimización del rendimiento.
Durante el estado de un repositorio muy grande y hay muchos cambios, un porcentaje significativo del tiempo de ejecución total se dedica a reasignar la wt_status.changes
matriz .
Este cambio reduce el tiempo wt_status_collect_changes_worktree()
de 125 segundos a 45 segundos en mi gran repositorio.
Además, Git 2.17 (Q2 2018) introducirá un nuevo rastreo, para medir dónde se pasa el tiempo en las operaciones con muchos índices.
Consulte la confirmación ca54d9b (27 de enero de 2018) de Nguyễn Thái Ngọc Duy ( pclouds
) .
(Combinado por Junio C Hamano - gitster
- en el compromiso 090dbea , 15 de febrero de 2018)
trace
: mide dónde se gasta el tiempo en las operaciones con muchos índices
Se miden todos los bloques de código pesado conocidos (excepto el acceso a la base de datos de objetos). Esto debería ayudar a identificar si una optimización es efectiva o no.
Un estado de git no optimizado daría algo como a continuación:
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'
El mismo Git 2.17 (Q2 2018) mejora git status
con:
revision.c
: reducir las consultas de la base de datos de objetos
En mark_parents_uninteresting()
, verificamos la existencia de un archivo de objeto para ver si debemos tratar una confirmación como analizada. El resultado es establecer el bit "analizado" en la confirmación.
Modifique la condición para verificar solo has_object_file()
si el resultado cambiaría el bit analizado.
Cuando una rama local es diferente de su referencia ascendente, " git status
" calculará los recuentos de adelante / atrás.
Esto usa paint_down_to_common()
y golpea mark_parents_uninteresting()
.
En una copia del repositorio de Linux con una instancia local de "master" detrás de la rama remota " origin/master
" por ~ 60,000 confirmaciones, encontramos que el rendimiento de " git status
" pasó de 1.42 segundos a 1.32 segundos, para una diferencia relativa de -7.0%.
Git 2.24 (Q3 2019) propone otra configuración para mejorar el git status
rendimiento:
Consulte confirmar aaf633c , confirmar c6cc4c5 , confirmar ad0fb65 , confirmar 31b1de6 , confirmar b068d9a , confirmar 7211b9e (13 de agosto de 2019) por Derrick Stolee ( derrickstolee
) .
(Combinado por Junio C Hamano - gitster
- en commit f4f8dfe , 09 de septiembre de 2019)
repo-settings: crea la configuración feature.manyFiles
La feature.manyFiles
configuración es adecuada para repositorios con muchos archivos en el directorio de trabajo.
Al establecer index.version=4
y core.untrackedCache=true
, los comandos como " git status
" deberían mejorar.
Pero:
Con Git 2.24 (Q4 2019), la ruta de código que lee la index.version
configuración se rompió con una actualización reciente, que se ha corregido.
Consulte la confirmación c11e996 (23 de octubre de 2019) de Derrick Stolee ( derrickstolee
) .
(Combinado por Junio C Hamano - gitster
- en el compromiso 4d6fb2b , 24 de octubre de 2019)
repo-settings
: lee un int para index.version
Firmado por: Derrick Stolee
Varias opciones de configuración se combinaron en una repo_settings
estructura en ds / feature-macros, incluido un movimiento de la configuración de configuración "index.version" en 7211b9e (" repo-settings
: consolidar algunas configuraciones de configuración", 2019-08-13, Git v2.24.0-rc1 - fusión listada en el lote # 0 ).
Desafortunadamente, ese archivo parecía un montón de texto estándar y lo que es claramente un factor de sobrecarga de copiar y pegar, la configuración de configuración se analiza con en repo_config_ge_bool()
lugar de repo_config_get_int()
. Esto significa que una configuración "index.version = 4" no se registraría correctamente y volvería a la versión predeterminada de 3.
Capté esto al incorporar v2.24.0-rc0 en el código base de VFS para Git, donde realmente nos importa que el índice esté en la versión 4.
Esto no fue detectado por el código base porque las comprobaciones de versión realizadas t1600-index.sh
no probaron lo suficiente el escenario "básico". Aquí, modificamos la prueba para incluir estas configuraciones normales para que no sean anuladas por features.manyFiles
o GIT_INDEX_VERSION
.
Si bien la versión "predeterminada" es la 3, se degrada a la versión 2 do_write_index()
cuando no es necesario.