web-dev-qa-db-ja.com

cygwin grepは、リモートデスクトップよりもssh経由で680倍高速に実行されます

Microsoftリモートデスクトップ経由でWindowsServer 1012 R2にCygwinターミナルを開いて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実行可能ファイルは同じで、出力ファイルも同じですが、実行時間は1秒に分割されますが、ほぼ2分です。

Cygwin SSHは特別なユーザー設定で実行されるため、リモートデスクトップでssh localhostを試みました。実行時間:1分40秒。

これについて論理的または非論理的な説明はありますか?リモートデスクトッププロセスを人為的に抑制するWindowsServer 2012で確認できる設定はありますか?

更新: WindowsコマンドラインからC:\ cygwin\bin\grep.exeを実行するcmdも瞬時に実行されます。そのため、Cygwinターミナルに問題があります。

更新2: PATHにデッドファイル共有があると、Bashターミナルの速度が低下する可能性があることをグーグルで調べました。私の最初の希望に反して、$ PATH変数を消去しても何も起こりませんでした。また、PATHにリンク切れはありません。

解決策、@ Paul Haldaneへの称賛:Grepは$LANGen_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 **
4
Muposat

解決策、@ Paul Haldaneへの称賛

LANGがC以外に設定されていると検索が遅くなるgrepのバグ – Paul Haldane22時間前

Grepは、Cygwinのデフォルトであるen_US.UTF-8の$ LANG値によってスローされるようです。これは、正規表現のパフォーマンスに特に大きな打撃を与えます。 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
Muposat

1つのsshは暗号化のためにオーバーヘッドを追加しますが、それは秒から分へのジャンプを説明しません。説明するのは、CygwinがUnix端末をエミュレートし、エミュレーションが遅いという事実です。これに関する詳細はウィキペディアで見つけることができます https://en.wikipedia.org/wiki/Cygwin

その部分はそれをかなりよく説明しています

プロセスを複製するためのforkシステムコールは完全に実装されていますが、WindowsAPIに適切にマップされていません。たとえば、コピーオンライトの最適化戦略は使用できませんでした。[5] [6] [7]その結果、CygwinのフォークはLinuxなどに比べてかなり遅いです。 (このオーバーヘッドは、fork/exec手法の使用を、Windows固有のprocess.hヘッダーで宣言されたspawn関数の呼び出しに置き換えることで回避できることがよくあります)。

0
sebastienvg