2012-08-25 40 views
0

我有一個程序非常基本,只有函數和變量,並執行一些計算。構建部分很好。只有cout,增加,等等非常基本的東西。從Linux到Windows的C/C++代碼非常慢

在Linux,程序運行在Eclipse CDT的細,(在大約3-4秒中運行)

當程序上的Visual Studio 2010 C++視窗7中運行,把163秒 當程序運行在Windows 7 eclipse C++與MinGW,很多

這裏發生了什麼?!!?!

編輯:用於不能稱之爲C++,它只是很多的這裏C函數,這裏是從主()

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

沒有看到用於編譯它的代碼和編譯器開關,我們就像你一樣無知。 –

+0

您是否嘗試過使用Win7 MinGW進行任何調試?只是爲了檢查,沒有圖書館被包括或鏈接? – MartyE

+0

@Insilico對不起,我已經包含了一些代碼,但不知道它是否有幫助。正如你所看到的,他們非常簡單。沒有瘋狂的文件輸出屏幕或文件,因爲我從代碼中刪除這些,程序仍然運行緩慢。我已經嘗試了調試和發佈。 「編譯器開關用於編譯它」是什麼意思? – woosah

回答

3

唯一的可靠方式找出你的程序在哪裏花費所有的時間是簡介它。這會告訴你每個方法/功能花費的時間,你應該能夠追蹤延遲。如果出於某種原因無法使用分析器,則可以嘗試在代碼的關鍵階段插入幾個定時調用來隔離問題的位置。

這就是說,我的猜測是在你程序的I/O部分(cout,printf ...)。計算應該在兩種體系結構上編譯爲類似的代碼,除非您使用外部庫,否則它們不應受移植進程的影響。另一方面,I/O調用可能會受到標準庫的差異以及每個OS如何處理緩衝和I/O的影響。可以想象,也可能有一些庫函數在Windows上不能很好地實現。

一個重要的信息就是你的程序在這160多秒內的表現如何。它是100%燃燒CPU還是怠速等待發生什麼?

1

在solveSystem()內部調用的函數之一可能因某種原因而表現不同。 我建議,你首先註釋掉solveSystem()中的所有函數。檢查它是否仍然在VC++上花費超過160秒。依次啓用solveSystem()中的函數。