在大型 monorepo(.git 目录 10GB)中,我观察到了以下行为。
# When outputing to a file, it is very fast:
time git log -2 > /tmp/X
real 0m0.076s
user 0m0.007s
sys 0m0.046s
# When outputting to the tty, it is more than 10x slower:
time git log -2
# ... Output omitted
real 0m0.830s
user 0m0.078s
sys 0m0.586s
以下是我的所有与日志相关的配置:
$ git config -l | grep log
log.mailmap=true
core.logallrefupdates=true
是什么导致了性能的差异,以及当 git log 输出到 tty 时如何获得相同的性能?
更多观察:
在较小的 repo 中,
git log -2
即使输出到 tty 也很快,因此问题似乎与大型 repo 有关。real 0m0.057s user 0m0.008s sys 0m0.022s
输出文件上的 Cat 速度很快,因此不仅仅是写入 stdout 很慢。
time cat /tmp/X real 0m0.015s user 0m0.001s sys 0m0.005s
expect
强制使用ttyunbuffer
也会减慢速度git log
:time unbuffer git log -2 > /tmp/X real 0m1.007s user 0m0.104s sys 0m0.669s
相比之下,
unbuffer
它本身的开销约为 240 毫秒:time unbuffer cat /tmp/X real 0m0.239s user 0m0.033s sys 0m0.111s