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は$LANG
の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 **
解決策、@ 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つのsshは暗号化のためにオーバーヘッドを追加しますが、それは秒から分へのジャンプを説明しません。説明するのは、CygwinがUnix端末をエミュレートし、エミュレーションが遅いという事実です。これに関する詳細はウィキペディアで見つけることができます https://en.wikipedia.org/wiki/Cygwin
その部分はそれをかなりよく説明しています
プロセスを複製するためのforkシステムコールは完全に実装されていますが、WindowsAPIに適切にマップされていません。たとえば、コピーオンライトの最適化戦略は使用できませんでした。[5] [6] [7]その結果、CygwinのフォークはLinuxなどに比べてかなり遅いです。 (このオーバーヘッドは、fork/exec手法の使用を、Windows固有のprocess.hヘッダーで宣言されたspawn関数の呼び出しに置き換えることで回避できることがよくあります)。