3

私はこのフォーラムに参加したばかりなので、最初から質問を正しくしていない場合は申し訳ありません。コードとは関係がなく、質問がより一般的である可能性があるため、ここでコードを提供する必要はないと思います。

Windows XP で MinGW (g++) を使用して、NetBeans 7.1.2 で C++ プロジェクトを作成してビルドしました。デバッグ バージョンとリリース バージョンの両方が正常に動作し、計算の目的の出力を提供します。ただし、NetBeans の内部ターミナルでプロジェクト (いずれかのプロジェクト) を「実行」すると、115 から 130 マイクロ秒の計算時間を測定できます。Windows コマンド プロンプトで exe ファイルを実行すると、500 ~ 3000 マイクロ秒の計算時間が測定されます。(2 GB RAM を搭載した 2.2 GHz Intel Core 2 Duo で。リセット後の CPU クロック ティック数を読み取り、CPU 周波数で割ることで時間を測定します。)
別のコンピューター(プロジェクトのビルドを含む)、2.2 GHz、16 GB RAM、およびWindows7でも同じことを試しました。プログラムは少し速く実行されますが、パターンは同じです。プロジェクトを NetBeans から外部端末 (Windows 端末でも) で実行する場合も同様です。また、デバッグ バージョンとリリース バージョンの両方に適用されます。

計算の 1 つ (最も時間が重要ではない) は高速フーリエ変換であり、fftw ( http://www.fftw.org/ ) の "libfftw3-3.dll" ライブラリに依存しています。NetBeans 内ではその場所がわかっています。Windows コマンド プロンプトでは、dll は実行可能ファイルと同じディレクトリにある必要があります。

Windows のコマンド プロンプト ウィンドウよりも NetBeans の内部端末ウィンドウの方がプログラムの実行速度がはるかに速いのはなぜですか?

ロード時のライブラリの動的リンクと何か関係があるのでしょうか?
ただし、NetBeans の端末よりも Windows コマンド プロンプトで実際に時間がかかる計算ステップは、dll の関数 (2 つの複素数の乗算) に依存しません。

プログラムで最も時間のかかる重要な計算は、次の型の複素数の 2 つの配列の乗算fftw_complexですdouble[2]

for(int i = 0; i < n; ++i) {  

    double k1 = x[i][0] * (y[i][0] - y[i][1]);  
    double k2 = (y[i][1] * -1) * (x[i][0] + x[i][1]);  
    double k3 = y[i][0] * (x[i][1] - x[i][0]);  


    result[i][0] = k1 - k2;  
    result[i][1] = k1 + k3;  
}  

xとは、実部と虚部を保持するy複素数の 2 つの配列です。同じ型の事前に割り当てられた配列です。 このループは、NetBeans の内部端末でプログラムを実行すると長さ 513 の配列で約 5 マイクロ秒かかりますが、Windows コマンド プロンプトでプログラムを実行すると 100 マイクロ秒かかります。seheの回答にある本当に役立つアドバイスのすべてに説明が見つかりませんでした。[i][0][i][1]result

実際のコードと関係があると思われる場合は、お知らせください。いくつか提供します。

同様の質問を探しましたが、見つかりませんでした。私が見逃した可能性のある他の質問や回答へのヒントやポイントをいただければ幸いです。乾杯。

4

1 に答える 1

1

私のコメントによると:

多くのコンソール IO を実行しますか? Microsoft コンソール ウィンドウが遅いことで有名

ENVIRONMENT 変数も見てください。

于 2012-05-10T13:05:25.343 に答える