我在Windows PC上的共享文件夹中有一个Git存储库,我使用UNC路径访问该文件夹,例如
git clone //server/share/MyRepo.git
当我从家中通过VPN获取此存储库中的更改时,非常需要很长时间才能运行git-upload-pack.exe
。我意识到没有服务器(如此),我的本地PC正在运行所有可执行文件。
git-upload-pack.exe
的名称告诉我,我的本地PC正在从远程文件共享中读取文件,以便将它们上传到某处,但这本身就是自己的,这没有任何意义。这反过来让我认为fetch
远不及它可能的表现。这就像本地机器正在做所有工作来减少要传输的数据,但要做到这一点,它必须传输所有数据。
有人能说明这是如何运作的吗?如果没有通过SSH或远程端的任何东西运行真正的Git服务器,或者是不必要地来回传输文件,性能是否尽可能好?
答案 0 :(得分:1)
它认为它就像本地文件系统。
通过SSH可以选择git:
答案 1 :(得分:1)
使用git 2.1(2014年8月),这个获取速度应该快得多:最近将一个旧的2012修复程序集成到git中。
见(theoleblond
)
compat/poll
:睡眠1毫秒以避免忙碌等待
SwitchToThread()
仅将当前时间片的其余部分泄露给当前进程中的另一个线程。因此,如果提供文件decscriptor的线程我们正在进行轮询,那么我们就会忙着等待。我玩了很多。在尝试了一些更复杂的方案之后,我发现最有效的方法是在迭代之间只睡1毫秒。虽然时间很短,但它仍然可以完全消除繁忙的等待条件,而不会伤害性能。
代码使用
SleepEx(1, TRUE)
来睡觉 请参阅this page,以便更好地讨论为什么这比调用SwitchToThread
更好,这是之前使用过的:请注意,调用
SleepEx(0, TRUE)
不解决忙等待。最引人注目的案例是在单CPU机器上使用大型仓库测试UNC共享时。
没有修复,花了4分15秒,修复它只需要1:08 !我认为这是因为git-upload-pack
忙碌的等待让CPU远离了正在进行实际工作的git进程。
使用多进程,时间差别不大,但仍然浪费了大量的CPU时间,这可能是需要做其他事情的服务器的杀手。