-3

という数字があるとnumします。何らかの条件 A が発生した場合は、数字を 1 増やし、そうでない場合は減らします。

次のようなコードを書くことができます。

if (A) ++num;
else --num;

このコードは、if-else なしで書くこともできますが、より多くの算術演算が必要になります (単純な基本的な算術演算だけで、指数、対数、または関数電卓が必要になるようなことは何もありません!) 次のようなもの:

num = num * x + y;

問題は、コードの最初のブロックと 2 番目のブロックのどちらがより高速に実行されるかということです。(これは Java です。ところで)。

(違いがないとは言わないでください。これは、私がやろうとしていることの非常に「初歩的な」バージョンにすぎません。しかし、これら 2 つの実行時間の違いを測定できる非常に優れたプロファイラーがあったとします。どっちが早い?)

ありがとう

4

3 に答える 3

4

この種の最適化はあまり意味がなく、ほとんどの場合、特に JIT を使用してバイトコードを最適化する Java 仮想マシンでは問題があります。

この種の最適化について心配する必要はありません...

于 2012-05-27T08:00:13.547 に答える
3

答えは、コンテキストと、コードを最適化するプラットフォーム上の JIT コンパイラの機能に依存するということです。

  • おそらく、アプリケーションのパフォーマンスに顕著な違いはありません。

  • たとえそうなったとしても、プラットフォーム (使用している特定の JVM / バージョンなど) と周囲のコードに依存するため、どのような違いが生じるかを予測することはできません。

最良のアドバイスは、オプティマイザがその仕事をするための最良の機会を与えるために単純にコードを書くことです。次に、パフォーマンスが問題になる場合は、アプリケーションをプロファイリングしてホットスポットの場所を確認し、ホットスポットを最適化します。プロファイラーがホットスポットであると判断した場合にのみ、このコードを最適化してください。

于 2012-05-27T07:59:00.260 に答える
1

分岐のコストが算術命令の10倍またはそれ以上になる可能性があることは何の価値もありません。ブランチの同じ側を繰り返し使用する場合、プロセッサはコストをほとんどゼロに減らすことができますが、ブランチの側が変わると、100クロックサイクルのオーダーのコストになる可能性があります。(++または-を指定すると、これは重要な1クロックサイクルになります)

于 2012-05-27T08:18:10.733 に答える