通过 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 函数的调用来避免这种开销)。