Блог им. aspotashevПоиск в Git

Самая простая команда для поиска текста в репозитории Git — «git grep <pattern>». Она ищет строки, соответствующие регулярному выражению <pattern> (как и обычный grep) во всех файлах, добавленных в репозиторий.
К таком виде «git grep» выполняет поиск по файлам рабочей копии, которые могут отличаться от файлов в HEAD. Но можно искать и в HEAD:
git grep <pattern> HEAD

Производительность
В большинстве случаев не имеет значения, где искать: в рабочей копии или в HEAD. В таком случае сравним время выполнения поиска в обоих случаях. В случае поиска в HEAD у меня получился выигрыш по скорости в 2-5 раз (ФС: reiserfs; тесты проводились на репозиториях проектов: Linux Kernel, ReactOS, Git).

Некоторые люди думают, что сжатие информации в репозиториях Git отрицательно влияет на производительность. Однако мы видим, что это не так. Для полной ясности скажу, что при поиске в рабочей копии информация берётся прямо из файлов, как они лежат в файловой системе, а при поиске в HEAD данные распаковываются из архивов репозитория, которые обычно бывают в большинстве своём сжатыми.

Я вижу две причины потрясающей скорости поиска в HEAD:
1. Для получения всех необходимых данных требуется считать меньший объём информации с диска. Конечно, есть дисковый кэш, но он может и кончиться.
2. На мой взгляд, самое главное — отсутствие необходимости чтения каждого файла отдельно. Файлы в репозиториях обычно бывают небольшими — порядка 10 Кбайт. Для того, чтобы считать один такой файл, нужно, как минимум, сделать несколько системных вызовов, которые ещё и «позовут» драйвер файловой системы, то есть это требует времени. Если же считывать данные из архивов репозотория (я имею ввиду главным образом pack'и), нужно считать небольшое количество этих архивов (они значительно большего размера, чем 10 КБ), а всё остальное уже делается без «походов» в ядро.

Обновление: Пару дней назад в Git добавили версию «git grep», использующую многопоточность. Так что поиск становится ещё быстрее. Ждём версии 1.7.0, надеюсь, они разберутся с проблемами в msysgit.

Комментарии (3)

  • avatar
  • LRN
  • 14 января 2010, 13:34
  • #
  • 0
Да, как говорит Scott Chacon в своём монументальном git 101 — «git ist schnell!»
правда бывает, что иногда хочется сказать и «git is scheisse» :-)
Да, по скорости поиска по коммитам и кодовой базе гиту просто нет равных. Собственно одна из причин гит-зеркала кода реактоса — возможность поиска в реальном времени.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.