git grep不使用多线程

git grep不使用多线程,git,grep,xargs,git-grep,Git,Grep,Xargs,Git Grep,我试图使用git grep搜索一个非常大的存储库的所有修订版。我使用的命令是: $ git rev-list --all | xargs git grep -I --threads 10 --line-number \ --only-matching "SomeString" 我正在mac上使用git的最新官方版本: $ git --version git version 2.19.1 这需要很长时间,查看活动监视器git只使用一个线程。但是,用户表示默认情况下应该使用8。它只使用一个带

我试图使用
git grep
搜索一个非常大的存储库的所有修订版。我使用的命令是:

$ git rev-list --all | xargs git grep -I --threads 10 --line-number \
  --only-matching "SomeString"
我正在mac上使用git的最新官方版本:

$ git --version
git version 2.19.1
这需要很长时间,查看活动监视器git只使用一个线程。但是,用户表示默认情况下应该使用8。它只使用一个带或不带
--threads
选项的线程。我没有任何其他配置集可以覆盖此设置:

$ git config --list
credential.helper=osxkeychain
user.name=****
user.email=****
你知道我错过了什么吗?其他人是否可以使用
git grep
并确认他们看到了多个线程


感谢您的帮助,我想知道这是否是因为您使用的是
|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
s,而不是使
git grep
能够使用多个线程,因此这是一种功能性的回答。

分配给
xargs
的线程数将取决于所使用的线程数

对于
git grep
,它过去默认为8

但是:

对于Git 2.26(2020年第1季度),这是现在的核心数量

参见,,,,,,,(2020年1月16日)作者。
(于2020年2月14日合并)

:使用内核数作为默认线程数 签字人:Matheus Tavares

如果未指定
--threads
,则默认情况下将使用8个线程

此固定数字对于具有较少内核的机器可能太多,对于具有较多内核的机器可能太少。
因此,取而代之的是,使用机器中可用的逻辑核的数量,这似乎会产生最佳的整体性能

以下测量值对应于chromium储存库中30次执行的平均运行时间,置信区间为95%(每组30次在2次预热运行后执行)。
正则表达式1是“
abcd[02]
”,正则表达式2是“
(静态的外部)(int | double)\*

(chromium在提交03ae96f时的回购(“在DSF=2时添加过滤器测试”,2019年6月4日),在执行“
git gc
”之后。)

上述测试是在运行Debian 10.0的台式机上进行的,该台式机采用Intel(R)Xeon(R)CPU E3-1230 V2(4核,带超线程)、32GB RAM和7200 rpm SATA 3.1 HDD

下面,对一台配备SSD的机器重复了测试:一台配备Intel(R)i7-7700HQ(4核,带超线程)和16GB RAM的Manjaro笔记本电脑:

      |          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

我想应该是
xargs-p10git grep-I--threads 1
@phd Yes,这样更有意义。我会更新;谢谢不过,这只提供了一个功能上近似的解决方案,因为git grep实际上不会是多线程的,这可能会对运行OP的架构产生影响。@Chris输出可能会交错?-我也在想这个。老实说,我不确定。(无论如何,给它一次机会,但我现在还不会接受这个——给别人留点时间,让他们做出更聪明的贡献)。@msanford是的,我现在正在运行一个测试。之前大约需要8个小时。笔记本电脑听起来好像要起飞了,所以现在肯定是资源最大化了。怀疑你的方法会快得多,完成后会回复结果。如果有人知道在传递这么多参数时如何使用git的内部线程,那么也将推迟接受一段时间。我将接受这个答案。它将时间从8个小时缩短到一个多小时。
      |          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