cygwin grep 通过 ssh 的运行速度比通过远程桌面快 680 倍

cygwin grep 通过 ssh 的运行速度比通过远程桌面快 680 倍

通过 Microsoft 远程桌面打开 Cygwin 终端到 Windows Server 1012 R2 来运行 grep(与本机相同吗?):

Administrator@MYSERV /cygdrive/d/bin/beta
$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme

real    1m40.568s
user    1m40.405s
sys     0m0.140s

通过 Cygwin SSH 连接时,对相同的文件执行完全相同的命令:

Administrator@MYSERV /cygdrive/d/bin/beta
$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delmessh

real    0m0.148s
user    0m0.140s
sys     0m0.000s

grep.exe 可执行文件相同,输出文件相同,但运行时间只是一瞬间,而不是近 2 分钟。

鉴于 cygwin SSH 在特殊用户设置下运行,我尝试ssh localhost在远程桌面上运行;运行时间:1 分 40 秒。

对此有什么合乎逻辑或不合逻辑的解释吗? 我可以在 Windows Server 2012 上检查哪些设置可以人为地抑制远程桌面进程?

更新: 从 Windows 命令行运行 C:\cygwin\bin\grep.execmd也是即时的。因此 Cygwin 终端存在问题。

更新 2: 我在 Google 上搜索到,PATH 中存在无效文件共享会降低 Bash 终端的速度。与我最初的希望相反,删除 $PATH 变量没有任何作用。PATH 中也没有任何无效链接。

解决方案,感谢@Paul Haldane$LANG:Grep 似乎被的值所困扰en_US.UTF-8,这是 Cygwin 中的默认值。这对正则表达式的性能影响尤其大。运行速度grep -F也变慢了,但只慢了 4 倍。

以下是在单独服务器上的验证:

$ echo $LANG
en_US.UTF-8

$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme

real    1m56.425s
user    1m56.218s
sys     0m0.171s

$ LANG=''

$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme2

real    0m0.286s
user    0m0.265s
sys     0m0.015s

$ diff delme delme2
** no difference **

答案1

解决方案,感谢@Paul Haldane

有一个grep 中的错误导致当 LANG 设置为非 C 时搜索速度变慢— Paul Haldane 22 小时前

Grep 似乎被 en_US.UTF-8 的 $LANG 值搞得一团糟,而这是 Cygwin 中的默认设置。这对正则表达式的性能影响尤其大。运行 grep -F 的速度也慢了 4 倍。

以下是在单独服务器上的验证:

$ echo $LANG
en_US.UTF-8

$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme

real    1m56.425s
user    1m56.218s
sys     0m0.171s

$ LANG=''

$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme2

real    0m0.286s
user    0m0.265s
sys     0m0.015s

$ diff delme delme2
** no difference **

答案2

首先,ssh 会因为加密而增加开销,但这并不能解释从几秒到几分钟的转变,真正能解释的是 Cygwin 模拟 Unix 终端,而模拟速​​度很慢。你可以在 Wikipedia 上找到有关此内容的更多详细信息https://en.wikipedia.org/wiki/Cygwin

那部分解释得很好

用于复制进程的 fork 系统调用已完全实现,但它与 Windows API 的映射并不好。例如,无法使用写时复制优化策略。[5][6][7] 因此,与 Linux 和其他系统相比,Cygwin 的 fork 相当慢。(通常可以通过将 fork/exec 技术的使用替换为对 Windows 特定的 process.h 标头中声明的 spawn 函数的调用来避免这种开销)。

相关内容