web-dev-qa-db-ja.com

MinGWが非常に遅いのはなぜですか?

私はCode :: Blocks IDE with GCC/MinGW on Windowsを使用しており、約2万行と40のソースモジュールを持つwxWidgetsアプリケーションを構築しようとしています。非常に遅い。

C++モジュールのコンパイルには2〜5秒かかり、リンクには2〜3分かかります。

これは移植可能なコードであり、このコードはLinux上で非常に高速にコンパイルされます。ビルドメッセージウィンドウをたどることができません...プロセス全体が20秒未満続きます。

一般的な調整(たとえば、プリコンパイル済みヘッダー、最適化をオフにするなど)を試しましたが、何も機能しませんでした。

なんでこんなに遅いの?

27
Calmarius

Active Directoryドメインを使用していますが、すぐには接続されていませんか?

MinGWが遅くなる理由についての「答え」はありませんが、ADドメインに属しているが、ADコントローラーに到達できないコンピューターでは、実行可能ファイル(など)の起動が遅れるというのが私の経験です。 rxvt.exe)および現在実行中のものでは、一時停止またはスタッターが発生します(MinGWを使用して構築されたemacsなど)。

私はまだこの振る舞いの実際の原因を決定するために調査していますが、それがあなたに当てはまる場合に備えて言及したいと思いました。

16

Windowsにはfork()がないため、MinGWの多くの「一意の」ものは非常に遅いです。 WindowsにはCreateProcess()しかありませんが、これはまったく異なります。 UnixシェルとGNU Makeは多くのフォークを実行するため、これらをMinGWで実行すると、「エミュレートされた」フォークが生成され、非常に低速になります。

これに悩まされるもう1つの問題は、GNU Autotoolsであるため、ソースから「unixy」アプリケーションを構築するときに_./configure_スクリプトを実行するのも非常に遅いです。これは、必要な場合に非常に煩わしいものになる可能性があります。それは何度もあります(たとえば、configureを取得してすべてのライブラリを見つけるのに問題がある場合)。

この回答 CygwinとMinGWがどのようにfork()をシミュレートするために使用されたかをより詳細に説明します この回答 より最新の説明があります。

10
hyde

MSYS 1.0.19-1の時点で、ユーザーアカウントがActive Directoryドメインにあり、ドメインコントローラー(DC)に到達できない場合、MSYS DLLは、MSYS実行可能ファイル(MSYS DLLを使用)を開始する前に長い遅延を導入します。これは、MSYS makeと、通常C:\MinGW\msys\1.0\binにインストールされるlsrmなどのCoreUtilsパッケージのすべてのコマンドラインユーティリティに影響します。

観察:

  • MSYS bash Shellからユーティリティを起動すると、シェルの起動のみが遅延の影響を受けます。シェルから起動されたユーティリティは影響を受けません。

  • 遅延は変動する可能性があり、私の場合は21秒です。

  • Delaydコマンドから10〜20秒以内にMSYSユーティリティを実行すると、新しい遅延なしで起動します。
  • 問題は、マシンが別のネットワークに接続されている場合、ドメインから切断されている場合、またはドメインコントローラーのホスト名が変更された場合に発生します(私の場合は問題)。 DCに到達可能かどうかを確認するには、cmdを開いてecho %LOGONSERVER%と入力し、次にpingまたはnet viewとDCのホスト名を入力します。

なぜそんなに遅いのですか:

  • uinfo.cc internal_getlogin()MSYS DLLのコードは、ユーザー情報を取得するために2つのシステムコールを実行します。初めてNetUserGetInfo()を呼び出して、ローカルマシンからユーザーアカウントを取得します。ドメインユーザーの場合は失敗するため、DCサーバーをLOGONSERVER変数から取得)で2回呼び出します。このホストにすぐにアクセスできない場合は、次のようになるまで長い遅延が発生します。タイムアウト時に呼び出しが失敗します。アプリケーションはすぐに起動します。

この問題を回避する方法、いくつかの回避策:

  • MSYS Shellからすべてを実行するか、
  • 理由がDCホスト名の変更である場合、再起動または再ログインすると問題が解決します。WindowsはLOGONSERVERを正しいDCホスト。
  • MSYSツールがWindowscmdまたはスクリプトから呼び出される場合は、ネットワークアクセスを回避するためにLOGONSERVERをローカルホストに設定します。例えば。 set LOGONSERVER=\\LOCALHOSTは私のために働いた。注:この変数はログオン時に設定され、Windows環境変数ウィンドウでグローバルに変更しても、cmdまたはスクリプトで設定する場合と比較して効果はありません。
  • これはMinGW/MSYSのバグだと思います。 MSYS2とCygwinのコードは異なります。 MSYS2を確認しましたが、そのような問題はありません。
8
AlexF