【问题标题】:Took C/C++ code from Linux to Windows is really slow将 C/C++ 代码从 Linux 转移到 Windows 真的很慢
【发布时间】:2012-08-25 18:44:39
【问题描述】:

我有一个非常基本的程序,只有函数和变量并执行一些计算。构建部分很好。只有 cout、加法、乘法等非常基本的东西。

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

【问题讨论】:

  • 没有看到用于编译它的代码和编译器开关,我们和你一样一无所知。
  • 你试过用 Win7 MinGW 调试吗?只是检查一下,没有包含或链接任何库?
  • @Insilico 抱歉,我已经包含了一些代码,但不知道它是否有帮助。如您所见,它们非常简单。没有疯狂的文件输出到屏幕或文件,因为我从代码中删除了这些并且程序仍然运行缓慢。我已经尝试过调试和发布。 “用于编译它的编译器开关”是什么意思?
  • @nos 对不起,我已经包含了一些代码,但不知道它是否会有所帮助。如您所见,它们非常简单。没有疯狂的文件输出到屏幕或文件,因为我从代码中删除了这些并且程序仍然运行缓慢。我已经尝试过调试和发布。 “用于编译它的编译器开关”是什么意思?
  • 分析您的代码。弄清楚它在哪里花费时间。找出为什么它在不同的地方表现不同。根据您在此处显示的内容,我们无法为您提供帮助。

标签: c++ c windows linux compiler-construction


【解决方案1】:

唯一可靠了解您的程序在哪里花费所有时间的方法是profile它。这将向您显示每个方法/功能所花费的时间,并且您应该能够追踪延迟。如果由于某种原因无法使用分析器,您可以尝试在代码的关键阶段插入一些计时调用来隔离问题的位置。

也就是说,我猜你的程序的 I/O 部分(coutprintf ...)。计算应在两种架构上编译为类似的代码,除非您使用外部库,否则它们不应受到移植过程的影响。另一方面,I/O 调用可能会受到标准库的差异以及每个操作系统如何处理缓冲和 I/O 的影响。可以想象,可能还有一些库函数在 Windows 上没有很好地实现。

一条重要的信息是您的程序在这 160 多秒内的行为方式。它是在 100% 消耗 CPU,还是在等待 某事 发生?

【讨论】:

    【解决方案2】:

    solveSystem() 内部调用的函数之一可能由于某种原因而表现不同。 我建议,您首先注释掉solveSystem() 中的所有函数。检查在 VC++ 上是否仍需要 160 多秒。依次启用solveSystem()中的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2012-08-11
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多