cygwin grep通过ssh比通过远程桌面运行速度提高了680倍

运行grep通过打开Cygwinterminal通过Microsoft远程桌面到Windows Server 1012 R2(原生?):

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命令行cmd运行C:\ cygwin \ bin \ grep.exe也是即时的。 所以Cygwinterminal有一个问题。

更新2:我GOOGLE了PATH中的死文件共享可以减慢Bashterminal。 相反,我最初的希望擦除$ PATHvariables没有做任何事情。 我也没有PATH中的任何死链接。

解决scheme,@Paul Haldane的荣誉 :Grep似乎被en_US.UTF-8$LANG值所抛弃,这是Cygwin中的默认值。 这对正则performance尤其困难。 运行grep -F也比较慢,但只有4倍。

这是一个单独的服务器上的validation:

 $ 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 ** 

解决scheme,@Paul Haldane的荣誉

当LANG被设置为C以外的其他内容时,grep中有一个错误导致search速度缓慢 – Paul Haldane 22小时前

Grep似乎被en_US.UTF-8的$ LANG值所抛弃,这是Cygwin中的默认值。 这对正则performance尤其困难。 运行grep -F也比较慢,但只有4倍。

这是一个单独的服务器上的validation:

 $ 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 ** 

对于一个ssh由于encryption而增加开销,但是并不能解释从几秒钟到几分钟的跳转,所以Cygwin模拟一个Unixterminal并且模拟速度很慢。 你可以在Wikipedia https://en.wikipedia.org/wiki/Cygwinfind更多关于这个的细节

这部分解释得很好

fork系统调用重复一个进程是完全实现的,但是它不能很好地映射到Windows API。 例如,写时复制优化策略不能被使用。[5] [6] [7] 因此,Cygwin的分支与Linux相比相当慢。 (通过将fork / exec技术的使用replace为Windows特定的process.h头文件中声明的spawn函数的调用,通常可以避免这种开销。