6

私はJavaに非常に慣れていません(そしてプログラミング全般、以前の経験はActionScript 2.0といくつかの単純なJavaScriptを使用しています)。また、Java:A Beginner's Guide byHerbertSchildtをゆっくりと系統的に進めています。信じられないほどの本です。

一つには、ビット単位の演算子(ActionScript 2.0で最初に遭遇した)が何をするか、そしてそれらが特定の合計に対して他の方法よりも効率的であることを最終的に理解しました。

私の質問は、たとえば右シフトを使用する方法を使用して、多くの計算(この場合は無秩序に広がる)を含む大規模なプログラムですべての除算/ 2(または除算/偶数)を実行する方が効率的ですか? RPG)、またはコンパイラがすべてを最適化するため、標準の数学演算を使用する方が効率的ですか?

または、私は完全に間違った質問をしていますか?

4

6 に答える 6

15

あなたは完全に間違った質問をしている。質問する必要があるのは、「コードをシンプルで読みやすくするか、パフォーマンスを測定していなくても、パフォーマンスが向上すると思われるトリックを使用するか」です。答えは明白なはずです。

ビット単位の演算子は、特に大量のデータを小さなスペースにパックする必要があるバイナリファイル形式を扱う場合に役立ちます。そして、誤って符号拡張しないように、バイトの上位ビットをマスクする方法を知ることは絶対に重要です(これらの2つの変数を出力して、私が何を意味するかを確認してください)。

byte b = (byte)0xDC;
int  i = b & 0xFF;

ただし、特に2で割るなどの単純なタスクを置き換えるために、これらの演算子を使用する場所を探しに行かないでください。

于 2012-08-28T21:38:38.037 に答える
4

このような最適化は、それを実行する必要がある場合にのみ実行する必要があります。コードがより速く実行されると単純に考える場合、それは価値がないかもしれません。

多くの場合、コンパイラはあなたが思っているよりも賢く、あなたに代わって最適化を行いますが、それ以外の場合は、問題をさらに深くするだけの警告があるかもしれません。それに加えて(そしておそらくこれを行うことに対する最大の理由)、将来の開発者(またはあなた自身)がコードを読みにくく/理解しにくくする場合は、将来、機能しようとして最適化をさらに追加するだけかもしれません。元のコードの周り。

于 2012-08-28T21:37:28.603 に答える
4

通常、コンパイラは多くの最適化を行います。また、最適化する前に、ボトルネックが実際に何であるかを調査する必要があります。ボトルネックではないものを最適化すると、より多くのスレッドが実際のボトルネックに早く到達することになります。制約理論を調べてください。

于 2012-08-28T21:38:01.770 に答える
3

学習目的では、その方法でコードの最適化をスキップできます。ある程度の経験が必要です。そうしないと、コードのデバッグで問題が発生する可能性があります(私は主に「これは一体何をしているのですか?」シンドロームを意味します)。ミリ秒またはCPUサイクルを本当に節約する必要がない限り、コードをクリーンに保つことに集中してください。

于 2012-08-28T21:37:58.630 に答える
2

後者。つまり、最初に可能な限り最も明確な方法でコードを記述します。これには、標準的な数学演算が必要になる可能性があります。残りはコンパイラに任せてください。

JavaはVM上で実行されるため、他にも興味深い組み込みの最適化機能があります。たとえば、プログラムの実行時に、VMはコードのどのブランチが最も頻繁に実行されているかを確認し、それらのブランチをより効率的にします。

プログラムを作成したら、プロファイリングツールを使用して、どの特定のメソッドが遅いかを測定します。それがわかれば、最適化するコードの種類がわかります。たとえば、ファイルから構成を読み取るのが最も遅いことに気付くかもしれません。それをより速くする方法を探すことができます。私の勘では、通常の算術ではなくビット演算子などを使用しても、パフォーマンス上の利点はまったく見られない可能性があります。

頑張ってください!

于 2012-08-28T21:37:58.537 に答える
0

一つには、ビット単位の演算子(ActionScript 2.0で最初に遭遇した)が何をするか、そしてそれらが特定の合計に対して他の方法よりも効率的であることを最終的に理解しました。

いいえ、これはここでは間違っています。ビット単位の演算には、あなたが求める除算や乗算を行うアプリケーションがたくさんあります。
ビットマスクをフラグとして、値をパックし、コンパクトな方法でアクセス権をエミュレートするために、暗号化などで効率的に使用できます。
このスレッドを参照してください。 シフトがどのように類似していて(おそらく)除算よりも速いかについて説明している章を読むだけでなく、より多くのアプリケーションを検索する必要があります(コンパイラがとにかくシフトに変換するため、必ずしもそうではありません)

于 2012-08-28T21:43:02.540 に答える