我有一个非常基本的程序,只有函数和变量并执行一些计算。构建部分很好。只有计算、加法、乘法等非常基本的东西。
在 linux 上,程序在 eclipse cdt 上运行良好,(运行大约 3-4 秒)
当程序在 visual studio 2010 c++ 的 windows 7 上运行时,耗时 163 秒 当程序在带有 MinGW 的 Windows 7 eclipse c++ 上运行时,很多
这是怎么回事??!!?!
编辑:我们不要称它为 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 部分(cout
、printf
...)。计算应该在两种架构上编译成相似的代码,除非您使用外部库,否则它们不应受到移植过程的影响。另一方面,I/O 调用可能会受到标准库的差异以及每个操作系统通常如何处理缓冲和 I/O 的影响。可以想象,可能还有一些库函数在 Windows 上没有很好地实现。
一个重要的信息是您的程序在这 160 多秒内的行为方式。它是在 100% 消耗 CPU,还是在闲置等待某事发生?
关于c++ - 将 C/C++ 代码从 Linux 转移到 Windows 真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12124707/