簡體   English   中英

將C / C ++代碼從Linux移植到Windows確實很慢

[英]Took C/C++ code from Linux to Windows is really slow

我有一個非常基本的程序,僅包含函數和變量,並執行一些計算。 構建部分很好。 只有cout,add,multiple等非常基礎的東西。

在Linux上,程序可以在Eclipse CDT上正常運行(運行大約3-4秒)

當程序在Visual Studio 2010 c ++的Windows 7上運行時,在帶有MinGW的Windows 7 eclipse c ++上運行程序需要163秒

這里發生了什么??!!?!

編輯:不要叫它c ++,這里只是C函數,這里是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()以下(部分)僅用於對某些變量進行計算的函數:

      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()函數只是使用C樣式文件輸出

   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);
   }

找出程序在所有時間上花費的唯一可靠方法是分析程序。 那將顯示您在每種方法/功能上花費的時間,並且您應該能夠跟蹤延遲。 如果由於某種原因而無法使用事件探查器,則可以嘗試在代碼的關鍵階段插入一些計時調用,以找出問題所在。

就是說,我的猜測將在程序的I / O部分( coutprintf ...)。 計算結果應在兩種體系結構上均編譯為相似的代碼,除非您使用外部庫,否則它們不應受到移植過程的影響。 另一方面,I / O調用可能會受到標准庫以及每個操作系統通常如何處理緩沖和I / O的差異的影響。 可以想象,可能還有一些庫函數在Windows上沒有很好地實現。

重要的信息是在那160秒鍾內您的程序的行為。 是100%消耗CPU,還是閑置等待某事發生?

由於某些原因,在solveSystem()內部調用的功能之一可能會有所不同。 我建議您首先注釋掉resolveSystem()中的所有功能。 檢查在VC ++上是否仍需要160+秒。 依次啟用solveSystem()中的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM