为什么Cygwin执行shell命令的速度非常慢?

时间:2011-07-25 03:04:08

标签: bash cygwin

只需测试一个非常简单的命令,如:

while true; do bash -c "echo hello"; done

你会发现Cygwin中的bash有多慢。有人知道为什么吗?

这是在win7上全新安装的cygwin 1.7。

感谢Jared的测试理念,我将命令修改为此(添加了bash -c):

time for i in {1..10} ; do bash -c "echo Hello" ; done
Hello
...
real 0m7.711s //it's the problem
user 0m0.091s
sys 0m0.476s

11 个答案:

答案 0 :(得分:12)

如何从防病毒软件中排除Cygwin路径?

答案 1 :(得分:7)

检查你的路径。引用不存在的路径或非常慢的网络共享可能会导致您描述的症状。

答案 2 :(得分:7)

以下是我遇到的3个可能原因。当然,未提及的其他问题也可能导致Cygwin中的shell命令缓慢。

  • 如果“LAN设置”中有“自动检测设置”选项,Windows将使用WPAD协议来发现本地HTTP代理。首先,它将使用选项252发送DHCP“通知”请求,然后它将尝试在“wpad”上进行DNS查找。这两个操作可能需要几秒钟才能超时。

  • 如果shell访问某些路径,如/cygdrive/...,将执行NetBIOS名称查询,这也可能需要一些时间。

  • 如果shell访问某些路径,如//mypath/...,将执行NetBIOS名称查询,这也可能需要一些时间。

解决方案:

  • 在Windows“Internet选项”控制面板的“局域网设置”中禁用“自动检测设置”。

  • %SystemRoot%\system32\drivers\etc\hosts中添加以下条目:

  

127.0.0.1 localhost cygdrive wpad

  • 确保在所有路径的开头避免使用双斜线。

答案 3 :(得分:5)

最后,我找到了源 - 我办公室电脑上运行的名为“QQPCMgr RTP Service”的服务,它是“QQ PC Manager”的实时保护服务。

通过禁用它,问题中脚本的时间可以追溯到:

real    0m0.943s
user    0m0.105s
sys     0m0.231s

我已经告诉QQPCMgr的开发者这个,希望他们能找到原因。

这仍然比Linux慢得多,但与其他cygwin计算机的“实时”相同。

谢谢大家!

答案 4 :(得分:2)

让我们给它一些数字。我运行了以下内容:

time for i in {1..1000} ; do echo "Hello" ; done

我从标准Cygwin bash窗口得到的结果是:

...
Hello
Hello

real    0m0.584s
user    0m0.031s
sys     0m0.000s

从同一系统的xterm bash窗口我得到:

...
Hello
Hello

real    0m0.037s
user    0m0.016s
sys     0m0.000s

我认为这几乎可以为你解答这个问题。问题是你正在经历像Windows一样的“cmd”窗口,这本身就很慢。 Cygwin本身并不是问题所在,它是显示器试图跟上,这会减慢速度(对于这个测试)。

答案 5 :(得分:1)

从shell脚本调用bash不是很快。使用

是否更快
while true; echo hello; done

答案 6 :(得分:1)

我投了James McLeod,因为启动bash过程需要一些时间,但这并不意味着它的运行速度会慢于UNIX。

在bash脚本中调用bash -c几乎没有意义,Makefile可以调用很多bash子进程,除非你在命令末尾添加; \

例如,如果Makefile具有以下内容:

echo Hello World
echo Good Bye

它将调用两个bash进程。为了加快速度并只调用一个bash进程:

echo Hello World; \
echo Good Bye

Debian采用dash而不是bash作为主shell,因为使用bash启动许多init脚本会使系统启动需要更长的时间(每个脚本调用自己的bash进程)。

答案 7 :(得分:1)

我能够通过卸载bash-completion并从Kaspersky切换到Windows Security Essentials来解决此问题。 (我在运行“echo Hello”基准时使用Process Explorer诊断卡巴斯基干扰。)将我的基准时间从7秒带到0.2。

答案 8 :(得分:1)

在Comodo Internet Security Premium 10上,我添加了" C:\ Users \\ Documents \ MobaXterm \ slash \ bin"到可信文件列表。 (设置 - >文件评分 - >文件列表)。本地终端现在又快了。

答案 9 :(得分:1)

这就是这个问题对我而言的表现。对于第一个说在cygwin提示符下输入的20个命令它很快,然后突然变得非常缓慢。

我检查了路径中的每个项目都是有效目录。

我尝试了其他地方建议的身份验证修复 - https://superuser.com/questions/877051/cygwin-from-windows-very-slow-laggy/1247517。 它对我不起作用。

我用Sophos替换了我的exisitng病毒扫描程序(System Center Endpoint Protection)。这解决了我的问题。希望这会有所帮助。

答案 10 :(得分:1)

对于Windows Defender:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender]
"DisableAntiSpyware"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection]
"DisableBehaviorMonitoring"=dword:00000001
"DisableOnAccessProtection"=dword:00000001
"DisableScanOnRealtimeEnable"=dword:00000001

或不太引人注目:

powershell -Command Add-MpPreference -ExclusionPath "C:\opt\cygwin64"
powershell -Command Add-MpPreference -ExclusionPath "C:\home"
powershell -Command Add-MpPreference -ExclusionProcess "git.exe"
powershell -Command Add-MpPreference -ExclusionExtension ".c"
powershell -Command Add-MpPreference -ExclusionExtension ".cpp"
powershell -Command Add-MpPreference -ExclusionExtension ".cxx"

对于Sophos:

REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\Sophos Endpoint Defense\Scanning\Config" /v "OnAccessExcludeFilePaths" /t REG_MULTI_SZ /d "C:\Program Files (x86)\Sophos\Sophos Anti-Virus\\0C:\home\\0D:\Video\\" /f
REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\Sophos Endpoint Defense\Scanning\Config" /v "OnAccessExcludeProcessPaths" /t REG_MULTI_SZ /d "C:\opt\cygwin64\\" /f