运行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函数的调用,通常可以避免这种开销。