私のCコードを修正した後(元々はWindows用でVS 2008でコンパイル)、Linux上で実行しました。驚いたことに、今はWindows版より少なくとも10倍遅いです。Windowsと比較してLinuxでコードが遅い
/* 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
少なくとも、(1)使用したコンパイラオプションと、(2)費やした時間をどのように測定しているかを問わない限り、この質問は無意味です。 –
どのようにコードをコンパイルしましたか(コンパイラ、オプション、警告レベル) – Mat
別の推測では、2つのマシンでデータ型のサイズが異なるため、Linux上でさらに低レベルで計算を行うことになるかもしれません。データ型のサイズが2つのシステムで一致しているかどうかを確認する必要があります。私は正しい方向に向かっていますか? – gpuguy