在修改我的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("%d\n",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]++; ...