0

I have a program very basic with just functions and variables and performs some calculations. The build part is fine. there is only cout, adding, multiplying etc very elementary stuff.

On linux, program runs fine on eclipse cdt, (runs in about 3-4 seconds)

When the program runs on windows 7 on visual studio 2010 c++, took 163 seconds when the program runs on windows 7 eclipse c++ with MinGW, alot

What is going on here??!!?!

EDIT: lets not call it c++, its just alot of C functions here, here is the code from the main()

    foutput1 = fopen(FILENAME1, "w");
foutput2 = fopen(FILENAME2, "w");
solveSystem();
OutputStepToFile();
iter++;
do
{
    temporalExternalChange(tim);
    do
    {
        solveSystem();
        iter++;
    } while (iter<T_FOUT);
    iter = 0;
    OutputStepToFile();
    tim+=dt*T_FOUT;
    if (fmod(tim,T_PRINT)<=0.0){cout << "\nt=" << tim << "ms";};
} while(tim<T_TOTAL);

SolveSystem() is the following (partial) which just functions that do calculations to some variables:

      void solveSystem()
      {

fsGCcGMPformation();        // !cGMP formation
falp1AdAct_IP3form();       // !Norepinephrine receptor
fIVoCC();                   // !Voltage dependent calcium current I_CaL
fIKv();                     // !Delayed rectifier current I_K
fIBKCa();                   // !Calcium-activated potassium 
    ...
    ...
    ...
fVoltageChange();
performODEstep();
}

OutputStepToFile() function is simply using C style file output

   void OutputStepToFile()
   {
    fprintf(foutput1,"%g %g %g %g %g %g %g %g ",V_m, tim, Ca_i, Na_i, K_i, Cl_i, Ca_u, Ca_r);                                                       // 1
    fprintf(foutput1,"%g %g %g %g %g %g %g ",d_L, f_L, BKCa_a, KvD_a, KvD_i_slow, KvD_i_fast, KCNQ_a);      // 8
    fprintf(foutput1,"%g %g %g %g ",P_SOC, R_01, R_10, R_11);   // 15
    fprintf(foutput1,"%g %g %g %g %g %g %g %g %g\n", h_IP3, RS_G, RS_PG, G, IP3, PIP2, DAG, V_cGMP, cGMP);  // 22

    // Store Ca,K,Cl,Na ion channels
    fprintf(foutput2,"%g %g %g %g %g %g %g %g %g ", I_CaL,  I_CaT,  I_BKCa, I_KvD, I_KCNQ, I_K2P, I_Kir, I_KATP, I_CaCC);
    // Store ROCs/SOCs
    fprintf(foutput2,"%g %g %g %g %g %g %g ",   INa_NSC, IK_NSC, ICa_NSC, I_NSC, I_SOCNa, I_SOCCa, I_SOC);
    // store SR dynamic currents, co-transporters, pumps and exchangers
    fprintf(foutput2,"%g %g %g %g %g %g %g %g ",    I_up, I_tr, I_rel, I_IP3, I_PMCA, I_NaK, I_NCX, I_NaKCl_Cl);
    fprintf(foutput2,"%g %g %g %g %g %g\n",     I_stim, V_cGMPbar,  I_Catotm,   I_Natotm,   I_Cltotm,   I_Ktotm);
   }
4

2 に答える 2

3

プログラムがどこで時間を費やしているかを知る唯一の信頼できる方法は、プロファイルを作成することです。これにより、各メソッド/関数で費やされた時間が表示され、遅延を追跡できるはずです。なんらかの理由でプロファイラーを使用できない場合は、問題の場所を特定するために、コードの重要な段階にいくつかのタイミング コールを挿入してみてください。

そうは言っても、私の推測では、プログラムの I/O 部分 ( cout, printf...) になります。計算は両方のアーキテクチャで同様のコードにコンパイルされ、外部ライブラリを使用していない限り、移植プロセスの影響を受けません。一方、I/O 呼び出しは、標準ライブラリの違いと、各 OS が一般的にバッファリングと I/O を処理する方法の違いによって影響を受ける可能性があります。おそらく、Windows ではうまく実装されていないライブラリ関数もあるかもしれません。

重要な情報は、その 160 秒以上の間にプログラムがどのように動作しているかです。CPU を 100% 消費していますか、それともアイドル状態で何かが起こるのを待っていますか?

于 2012-08-25T19:29:49.163 に答える
1

SolveSystem()内で呼び出される関数の1つが、何らかの理由で異なる動作をしている可能性があります。まず、solveSystem()のすべての関数をコメントアウトすることをお勧めします。VC++でまだ160秒以上かかるかどうかを確認します。solveSystem()の関数を次々に有効にします。

于 2012-08-25T19:15:58.263 に答える