比較的高速なWindowsマシンでCygwinを使用して( Drupalの)drushスクリプトを実行していますが、drushコマンド(具体的にはdrush cache clearの実行)を約1分待つ必要があります。
私の仲間の開発者(Linuxを実行している)はこれらのスクリプトを約5秒で実行できるので、Cygwinの速度と関係があると確信しています。
Cygwinが端末ごとにより多くのメモリやCPUを使用するようにする方法はありますか?
あなたが直面している問題は、設定を変更することで解決できる Cygwin の恣意的な制限ではありません。これは、Cygwin がその下で構築された POSIX セマンティクス プログラムを取得するために機能しなければならない方法の固有の側面です。
POSIXfork()
システム コールは、Windows にネイティブで同等のものがないため、Cygwin は非常に非効率的な方法でエミュレートする必要があります。シェル スクリプトはfork()
、外部プロセスを実行するたびに を呼び出します。これは、シェル スクリプト言語が通常プログラミング言語と呼ばれるものに比べて非常に貧弱であるため、非常に頻繁に発生します。外部プログラムは、シェルスクリプトが重要なことを実行する方法です。
Cygwin には他にも非効率な点がありますが、それをプロファイリングすると、おそらくそれが最大のスピード ヒットであることがわかります。ほとんどの場所で、Cygwin を使用して構築されたプログラムと基盤となる OS の間の Cygwin 層はかなり薄いです。Cygwin の開発者は、正しい POSIX セマンティクスを提供しながら、レイヤーをできるだけ薄く保つために多大な労力を費やしています。呼び出しエミュレーションの現在の珍しい厚さは、fork()
Microsoft が OS にネイティブfork()
型機能を追加しない限り、避けられません。それを行う彼らのインセンティブはあまり良くありません。
上記のコメントとして投稿されたソリューションは悪くありません。
もう 1 つの可能性は、drush
スクリプトを調べて、シェル組み込み関数またはより効率的なコンストラクトに置き換えることができる外部プログラムへの呼び出しがあるかどうかを確認することです。それによって大幅な速度の向上は期待できませんが、Linux 側でも速度が向上するという優れた特性があります。( fork()
Linux では効率的ですが、外部プログラムの起動は依然として大きな速度の打撃であり、現在ほど頻繁に支払う必要はないかもしれません。) たとえば:
numlines=`grep somepattern $somefile | wc -l`
if [ $numlines -gt 0 ] ; then ...
次のように高速に実行されます。
if grep -q somepattern $somefile ; then ...
最初のバージョンは間違いなくより明確ですが、少なくとも 3 つの外部プログラムの呼び出しが必要であり、プリミティブ シェルの場合は4です。(すべて表示されますか?) 置き換えに必要な外部プログラムの呼び出しは 1 つだけです。
Cygwinの起動を遅くするものも見てください:
bash_profile
ではなく、からそれらを調達しますbashrc
。Cygwin の優先順位を高くすることができます。
次の内容の新しいバッチ ファイル (たとえば、「cygstart.bat」) を作成します。
start "Cygwin" /high C:\cygwin\Cygwin.bat
この/high
スイッチは、シェルにより高いプロセス優先度を与えます。