加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

与Windows相比,Linux上的代码速度较慢

发布时间:2020-12-14 05:40:46 所属栏目:Windows 来源:网络整理
导读:在修改我的C代码(最初是为 Windows编写并在VS 2008下编译)后,我在 Linux上运行它.令我惊讶的是,它现在至少比Windows版本慢10倍. 使用Profiler工具我发现以下函数占用了应用程序花费的大部分时间: /* advance by n bits */void Flush_Buffer(N)int N;{ int I
在修改我的C代码(最初是为 Windows编写并在VS 2008下编译)后,我在 Linux上运行它.令我惊讶的是,它现在至少比Windows版本慢10倍.

使用Profiler工具我发现以下函数占用了应用程序花费的大部分时间:

/* advance by n bits */

void Flush_Buffer(N)
int N;
{
 int Incnt;


 ld->Bfr <<= N;

Incnt = ld->Incnt -= N;

if (Incnt <= 24)
{
if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
{
do
{
if (ld->Rdptr >= ld->Rdmax)
      Next_Packet();
    ld->Bfr |= Get_Byte() << (24 - Incnt);
    Incnt += 8;
  }
  while (Incnt <= 24);
}
else if (ld->Rdptr < ld->Rdbfr+2044)
{
  do
  {
    ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
    Incnt += 8;
  }
  while (Incnt <= 24);
}
else
{
  do
  {
    if (ld->Rdptr >= ld->Rdbfr+2048)
      Fill_Buffer();
    ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
    Incnt += 8;
  }
  while (Incnt <= 24);
}
ld->Incnt = Incnt;
}

}

这个功能在Windows上占用的时间可以忽略不计.在Linux上它需要接近14秒.我在这里犯了什么错?

此处没有系统调用,因此此代码段应独立于OS特定的调用,因此应在相同的时间运行.

(我的猜测:这个函数被多次调用,所以分析器也可能累??积所有调用的时间.在这种情况下,我认为其中一个问题可能是函数没有快速获取其输入参数与Windows案例相比.)

我在这里犯了什么错?有什么猜测?

Rgrds,

H

解决方法

您可以尝试使用计数器注释代码中的所有代码路径.在程序结束时,每个计数器将包含有关代码路径执行次数的信息.在Windows版本和Linux版本之间逐行比较这些数字可能会发现该程序遵循不同的代码路径.根据代码路径的性质,差异可能能够解释为什么Linux版本比Windows版本慢.

int count[100];

// Call this function at the end of program 
void PrintCounts() {
    int i;
    for(i=0; i<100; i++) printf("%dn",count[i]);
}

void Flush_Buffer(int N) {
  int Incnt;

  ld->Bfr <<= N;

  Incnt = ld->Incnt -= N;

  if (Incnt <= 24) {
    count[0]++;
    if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4)) {
      count[1]++;
      do {
         count[2]++;
         ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读