在修改了我的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秒钟的时间。我在这里犯了什么错误?
这里没有系统调用,因此此代码段应该独立于特定于操作系统的调用,因此应以相同的时间运行。
(我猜测:这个函数被调用了多次,所以可能分析器也累积了所有调用的时间。在这种情况下,我认为一个问题可能是该函数没有快速获取其输入参数,与Windows情况相比。)
我在这里犯了什么错误?有什么猜测吗?
问候,
gcc
编译器的选项-O[1|2|3]
? - alk