1

int a; などの負の整数があるとします。

-a のより高速な実装はありますか?

これに対してビット単位の操作を行う必要がありますか?

4

7 に答える 7

26

コンパイラがこれを変換する可能性が最も高いマシンコード NEG 命令よりも高速なものはほぼ確実にありません。

もしあれば、コンパイラはそれを使用すると確信しています。

2 の補数の場合、1 を加算することはできませんが、それはほぼ確実に遅くなります。しかし、C/C++ 標準が 2 の補数の使用を義務付けているかどうかは完全にはわかりません (そうかもしれませんが、私は確認していません)。

この質問は、strcpy()速度を上げるために et al を書き直そうとする人に属していると思います。それらの人々は、C ライブラリstrcpy()が特別なマシン コード命令を使用して (ほとんどの人が最初に試みるような単純なループではなく) 高度に最適化されていないことを素朴に想定しています。

否定に非常に長い時間がかかっていることを示すパフォーマンス テストを実行しましたか?

<微妙なユーモアまたは私の妻が呼ぶもの-おかしくない>

    486 の NEG (前回クロック サイクルを気にしなければならなかった最新の状態) は 3 クロック サイクルかかります (メモリ バージョン、レジスタは 1 しかかかりません)。3Ghz の CPU では、これは毎秒 10 億回実行できることを意味します。それは十分に速くありませんか?

</subtle-humor-or-what-my-wife-calls-unfunny>

于 2009-03-19T02:16:53.020 に答える
2

数値の否定は、CPUハードウェアの観点からは非常に簡単な操作です。ビット単位の演算を実行するよりも否定を実行するのに時間がかかり、30年前のプロセッサが含まれているプロセッサを私は知りません。

好奇心が強いのですが、なぜこの質問をするようになったのですか?ボトルネックを検出したからではありません。

于 2009-03-19T03:02:02.023 に答える
1

すべての良い答え。

違いがある場合(-a)は、非常に積極的なパフォーマンス チューニングを既に行っています。

プログラムのパフォーマンス チューニングは、湿ったスポンジから水を取り出すようなものです。プログラムは最初に書かれたものなので、かなり濡れています。少しの努力で、それから時間を絞り出すことができます。もっと努力すれば、もう少し乾かすことができます。

本当にしつこい場合は、最後の数分子の時間を取得するために、暑い太陽の下に置く必要がある場所まで下げることができます.

(-a)それは違いを生むかもしれないレベルです。

于 2009-03-19T11:59:41.013 に答える
0

負の数値でパフォーマンスの問題が発生していますか? ほとんどのコンパイラが整数に対してビットごとの操作を行って整数を否定するとは思えません。

于 2009-03-19T02:14:45.023 に答える