私はCode :: Blocks IDE with GCC/MinGW on Windowsを使用しており、約2万行と40のソースモジュールを持つwxWidgetsアプリケーションを構築しようとしています。非常に遅い。
C++モジュールのコンパイルには2〜5秒かかり、リンクには2〜3分かかります。
これは移植可能なコードであり、このコードはLinux上で非常に高速にコンパイルされます。ビルドメッセージウィンドウをたどることができません...プロセス全体が20秒未満続きます。
一般的な調整(たとえば、プリコンパイル済みヘッダー、最適化をオフにするなど)を試しましたが、何も機能しませんでした。
なんでこんなに遅いの?
Active Directoryドメインを使用していますが、すぐには接続されていませんか?
MinGWが遅くなる理由についての「答え」はありませんが、ADドメインに属しているが、ADコントローラーに到達できないコンピューターでは、実行可能ファイル(など)の起動が遅れるというのが私の経験です。 rxvt.exe)および現在実行中のものでは、一時停止またはスタッターが発生します(MinGWを使用して構築されたemacsなど)。
私はまだこの振る舞いの実際の原因を決定するために調査していますが、それがあなたに当てはまる場合に備えて言及したいと思いました。
Windowsにはfork()
がないため、MinGWの多くの「一意の」ものは非常に遅いです。 WindowsにはCreateProcess()
しかありませんが、これはまったく異なります。 UnixシェルとGNU Makeは多くのフォークを実行するため、これらをMinGWで実行すると、「エミュレートされた」フォークが生成され、非常に低速になります。
これに悩まされるもう1つの問題は、GNU Autotoolsであるため、ソースから「unixy」アプリケーションを構築するときに_./configure
_スクリプトを実行するのも非常に遅いです。これは、必要な場合に非常に煩わしいものになる可能性があります。それは何度もあります(たとえば、configureを取得してすべてのライブラリを見つけるのに問題がある場合)。
この回答 CygwinとMinGWがどのようにfork()
をシミュレートするために使用されたかをより詳細に説明します この回答 より最新の説明があります。
MSYS 1.0.19-1
の時点で、ユーザーアカウントがActive Directoryドメインにあり、ドメインコントローラー(DC)に到達できない場合、MSYS DLL
は、MSYS実行可能ファイル(MSYS DLL
を使用)を開始する前に長い遅延を導入します。これは、MSYS make
と、通常C:\MinGW\msys\1.0\bin
にインストールされるls
、rm
などのCoreUtilsパッケージのすべてのコマンドラインユーティリティに影響します。
観察:
MSYS bash
Shellからユーティリティを起動すると、シェルの起動のみが遅延の影響を受けます。シェルから起動されたユーティリティは影響を受けません。
遅延は変動する可能性があり、私の場合は21秒です。
cmd
を開いてecho %LOGONSERVER%
と入力し、次にping
またはnet view
とDCのホスト名を入力します。なぜそんなに遅いのですか:
uinfo.cc internal_getlogin()
のMSYS DLL
のコードは、ユーザー情報を取得するために2つのシステムコールを実行します。初めてNetUserGetInfo()
を呼び出して、ローカルマシンからユーザーアカウントを取得します。ドメインユーザーの場合は失敗するため、DCサーバーをLOGONSERVER
変数から取得)で2回呼び出します。このホストにすぐにアクセスできない場合は、次のようになるまで長い遅延が発生します。タイムアウト時に呼び出しが失敗します。アプリケーションはすぐに起動します。この問題を回避する方法、いくつかの回避策:
LOGONSERVER
を正しいDCホスト。cmd
またはスクリプトから呼び出される場合は、ネットワークアクセスを回避するためにLOGONSERVER
をローカルホストに設定します。例えば。 set LOGONSERVER=\\LOCALHOST
は私のために働いた。注:この変数はログオン時に設定され、Windows環境変数ウィンドウでグローバルに変更しても、cmd
またはスクリプトで設定する場合と比較して効果はありません。