2009-05-30 62 views
21

私はCode :: Blocks IDEをGCC/MinGW with Windowsで使用しています。私はcaを持つwxWidgetsアプリケーションをビルドしようとしています。 20k行と40個のソースモジュールそれは非常に遅いです。なぜMinGWは非常に遅いのですか?

C++モジュールのコンパイルは2〜5秒間続き、リンクは2〜3分です。

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

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

どうして遅いですか?

+0

どのgccバージョンをお使いですか?コマンドラインでgcc --versionを実行してください。 –

+0

gccのバージョンはv3.4.5 – Calmarius

答えて

13

あなたはActive Directoryドメインにいますが、直ちに接続していませんか?

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

私はまだこの現象のを実際にと判断して調査中ですが、それがあなたに当てはまる場合はそれを言及すると思います。

+5

+1ネットワークアダプターを無効にするとすぐに起動します。ホストファイルにドメインコントローラ用の偽のDNSエントリ(127.0.0.1)を置くと、ネットワークが完全に無効になるほど速くなりますが、速くはできません。 –

+0

私たちのADコントローラは:server.domain.comです。 "127.0.0.1 server.domain.com"を自分のホストファイルに追加すると、そのトリックが実行されます。 – rcmadruga

+0

このヒントをありがとう。私はなぜこれが私のマシンの1つでしか起こらないのか、年齢について疑問に思っています!それは、それがそのADドメインに接続されていないことが起こります... –

0

より新しいバージョンのツールセットを使用できます。これは役に立つと分かりました: http://nuwen.net/mingw.html これは、MinGWと一般的なAPIで使用されるすべてのツールを1つの大きなパッケージにまとめました。サイトから :

マイMinGWの分布( "ディストリビューション")は、x64のネイティブであり、現在 GCC 6.1.0および1.61.0ブースト含まれています。

MinGWはGCCからWindowsへのポートです。それは無料であり、 (ツールチェーンと同じくらい簡単に入手できます)を使用するのは簡単です。これはスタンドアロンの Windows実行可能ファイルを生成します。これは任意の方法で配布できます。

6

Windowsがfork()であるため、MinGWの多くの "unixy"なことは辛いほど遅いです。 WindowsはCreateProcess()しかありませんが、それは全く異なります。 UnixシェルとGNU Makeは多くのフォークを行うので、MinGWの下でこれらを実行すると、実際には遅い「エミュレートされた」フォークが生成されます。

もう1つはGNU Autotoolsです。ソースから "unixy"アプリケーションをビルドするときには./configureスクリプトを実行することも非常に遅いです。これは、何度もやる必要がある場合(例えば、にすべてのライブラリを見つけるためにを設定することで問題が発生した場合など)、本当に迷惑になることがあります。

This answerはCygwinとMinGWのfork()をシミュレートするために使用する方法をより詳細に説明し、this answerは、日付の説明までより多くのを持っています。 MSYS 1.0.19-1のよう

+1

fork()がexecp()の後に現行のプロセスを複製するのではなく、実際に現在のプロセスを複製するのに実際に使用されていることを伝えようとしていますか?どのコンパイラ/リンカがプロセスをクローンする必要がありますか? –

+1

@ExcessPhaseあなたはそれが何を意味するか分かりません。 Unixプログラムは 'fork()'を使って子プロセスを作成します。 MinGW用のUnixプログラムをコンパイルするとき、 'fork()'の後に* exec *、no(*)が続く場合でも 'fork()'コール* still *は 'real 'Unixと同じように子プロセスを作成する必要があります。コンパイラがWindows上でより効率的に動作するようにプログラムコードを変更することはできないため、MinGWがどのくらい遅くエミュレートされるかが問題になります。 – hyde

+0

@ExcessPhase物事は最適化されているかもしれませんが、今私は2番目の回答リンクを追加しました。 – hyde

1

ユーザーアカウントがActive Directoryドメインにあり、ドメインコントローラ(DC)が到達不能である場合には、その後、MSYS DLLは(MSYS DLLを使用しています)任意のMSYSの実行ファイルを起動する前に、長い遅延を導入します。これは、一般的にC:\MinGW\msys\1.0\binにインストールされている,rmなどのMSYS makeおよびCoreUtilsパッケージのすべてのコマンドラインユーティリティに影響します。

観察:MSYS bashシェルからのユーティリティを起動すると

  • 、唯一のシェルの起動が遅れに見舞われています。シェルから起動されたユーティリティは影響を与えません。

  • 遅延は、私の場合は21秒です。

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

なぜそれがとても遅いです:

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

、いくつかの回避策:理由は、DCのホスト名の変更は、その後、再起動または再ログインがされます場合には

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