3

私は自分のコードをプロファイリングし、可能な限りすべてを最適化して、次のような関数にたどり着きました:

double func(double a, double b, double c, double d, int i){
    if(i > 10 && a > b || i < 11 && a < b)
        return abs(a-b)/c;
    else
        return d/c;
}

プログラムの実行中に何百万回も呼び出され、プロファイラーは、すべての時間の約 80% が の呼び出しに費やされていることを示していabs()ます。

  1. に置き換えabs()fabs()ところ、約 10% の速度向上が得られましたが、浮動小数点数については同じであり、常に使用する必要があると何度も聞いたので、あまり意味がありませんabs()。それは真実ではありませんか、それとも何かが欠けていますか?

  2. パフォーマンスをさらに向上させることができる double の絶対値を評価する最も簡単な方法は何ですか?

それが問題になる場合はg++、Linux X86_64 で使用します。

4

4 に答える 4

1

もしそうなら、展開しようとしましたか:

double func(double a, double b, double c, double d, int i){
    if(i > 10 && a > b)
        return (a-b)/c;
    if (i < 11 && a < b)
        return (b-a)/c;
    return d/c;
}
于 2013-05-23T02:14:15.620 に答える
0

fabs() を呼び出して生成されたアセンブリを確認します。関数呼び出しのオーバーヘッドである可能性があります。その場合は、インライン ソリューションに置き換えます。本当にコストのかかる絶対値チェックの内容なら、符号ビット以外はビットマスク1のビット単位AND(&)を試してみてください。ただし、これが標準ライブラリ ベンダーの fabs() が生成するものよりも安価になるとは思えません。

于 2013-05-23T02:28:50.063 に答える