git-grep не использует несколько потоков

Я пытаюсь использовать git grep искать все ревизии очень большого хранилища. Я использую команду:

$ git rev-list --all | xargs git grep -I --threads 10 --line-number \
  --only-matching "SomeString"

Я использую последнюю официальную версию Git на Mac:

$ git --version
git version 2.19.1

Это занимает очень много времени, глядя на монитор активности, используя только один поток. Однако в документах говорится, что по умолчанию следует использовать 8. Используется только один поток с или без --threads <num> вариант. У меня нет другого набора настроек, который бы переопределил этот параметр:

$ git config --list
credential.helper=osxkeychain
user.name=****
user.email=****

Есть идеи, что мне не хватает? Может ли кто-нибудь еще использовать git-grep и подтвердить, что они видят несколько потоков?

Спасибо за любую помощь

1 ответ

Решение

Интересно, если это потому, что вы используете | xargs, который ждет ввода на stdin, Поскольку выход из git rev-list это единственный поток, xargs, по умолчанию будет использоваться только один процесс:

-P max-procs, --max-procs=max-procs
              Run up to max-procs processes at a time; **the default is 1**.  If
              max-procs is 0, xargs will run as many processes as possible
              at a time.

Поэтому попробуйте увеличить его, используя флаг выше:

git rev-list --all | xargs -P 10 git grep -I --threads 1 --line-number \
    --only-matching "SomeString"

Это породит несколько git grepСкорее, что позволяют git grep использовать несколько потоков, так что это своего рода функциональный ответ.

Количество потоков, которые нужно выделить xargs будет зависеть от количества потоков, используемых git grep.

Раньше по умолчанию было 8 для git grep.

Но:

В Git 2.26 (первый квартал 2020 г.) это количество ядер.

См. Фиксацию f1928f0, фиксацию 70a9fef, фиксацию 1184a95, фиксацию 6c30762, фиксацию c441ea4, фиксацию d799242, фиксацию 1d1729c, фиксацию 31877c9, фиксацию b1fc9da, фиксацию d5b0bac, фиксацию faf123c, фиксацию c3a5bb3 (16 января 2020 г.) ( Матеус Тауресmatheustavares).
(Слияние Junio ​​C Hamano -gitster- в коммите 56ceb64, 14 февраля 2020 г.)

grep: использовать нет. ядер по умолчанию нет. потоков

Подписано: Матеус Таварес

когда --threads не указано, git grep по умолчанию будет использовать 8 потоков.

Это фиксированное число может быть слишком большим для машин с меньшим количеством ядер и слишком маленьким для машин с большим количеством ядер.
Поэтому вместо этого используйте количество логических ядер, доступных в машине, что, по всей видимости, дает наилучшую общую производительность.

Следующие измерения соответствуют среднему истекшему времени для 30 git grep выполнений в репозитории хрома с 95% доверительным интервалом (каждый набор из 30 выполнялся после 2 прогонов).
Regex 1 - это 'abcd[02]'и Regex 2 -'(static|extern) (int|double) \*'.

(репо хрома при фиксации 03ae96f ("Добавить тестирование фильтров при DSF=2", 04.06.2019), после 'git gc'исполнение.)

      |          Working tree         |           Object Store
------|-------------------------------|--------------------------------
 #ths |  Regex 1      |  Regex 2      |   Regex 1      |   Regex 2
------|---------------|---------------|----------------|---------------
  32  |  2.92s ± 0.01 |  3.72s ± 0.21 |   5.36s ± 0.01 |   6.07s ± 0.01
  16  |  2.84s ± 0.01 |  3.57s ± 0.21 |   5.05s ± 0.01 |   5.71s ± 0.01
   8  |  2.53s ± 0.00 |  3.24s ± 0.21 |   4.86s ± 0.01 |   5.48s ± 0.01
   4  |  2.43s ± 0.02 |  3.22s ± 0.20 |   5.22s ± 0.02 |   6.03s ± 0.02
   2  |  3.06s ± 0.20 |  4.52s ± 0.01 |   7.52s ± 0.01 |   9.06s ± 0.01
   1  |  6.16s ± 0.01 |  9.25s ± 0.02 |  14.10s ± 0.01 |  17.22s ± 0.01

Вышеупомянутые тесты были выполнены на настольном компьютере под управлением Debian 10.0 с процессором Intel(R) Xeon(R) E3-1230 V2 (4 ядра с гиперпоточностью), 32 ГБ ОЗУ и жестким диском SATA 3.1 7200 об / мин.

Ниже, тесты были повторены для машины с SSD: ноутбука Manjaro с Intel(R) i7-7700HQ (4 ядра с гиперпоточностью) и 16 ГБ оперативной памяти:

      |          Working tree          |           Object Store
------|--------------------------------|--------------------------------
 #ths |  Regex 1      |  Regex 2       |   Regex 1      |   Regex 2
------|---------------|----------------|----------------|---------------
  32  |  3.29s ± 0.21 |   4.30s ± 0.01 |   6.30s ± 0.01 |   7.30s ± 0.02
  16  |  3.19s ± 0.20 |   4.14s ± 0.02 |   5.91s ± 0.01 |   6.83s ± 0.01
   8  |  2.90s ± 0.04 |   3.82s ± 0.20 |   5.70s ± 0.02 |   6.53s ± 0.01
   4  |  2.84s ± 0.02 |   3.77s ± 0.20 |   6.19s ± 0.02 |   7.18s ± 0.02
   2  |  3.73s ± 0.21 |   5.57s ± 0.02 |   9.28s ± 0.01 |  11.22s ± 0.01
   1  |  7.48s ± 0.02 |  11.36s ± 0.03 |  17.75s ± 0.01 |  21.87s ± 0.08
Другие вопросы по тегам