1

質問1

Javaでは、単一のステートメントを使用して同じ数だけシフトするよりも、シフトする方が何倍もコストがかかりますか?

たとえば、

int x = 5;
x = x << 16;

より速い

int x = 5;
for (int i=0; i<16; ++i) {
    x = x << 1;
}

さらに、どうでしょう

int x = 5;
for (int i=0; i<16; ++i) {
    x = x*2;
}

編集: "x << 16" の正確なパフォーマンスは? 「x << 1」と同じ速さですか?

質問2

StackOverflow ユーザーの時間を無駄にする必要がないように、Java でさまざまなビット単位の操作パフォーマンスを判断するために利用できるオンラインのリソースはありますか? :-)

4

4 に答える 4

5

...StackOverflow ユーザーの時間を無駄にする必要がないようにするには?

あなたも自分の時間を無駄にしています。アプリケーションの完全なプロトタイプを作成し、プロファイリングしてから最適化します。ボトルネックがビットシフトによるものではないことがわかると確信しています。

これは時期尚早の最適化の匂いがします。

「x << 16」の正確な性能は? 「x << 1」と同じ速さですか?

はい、同じです。しかし、技術的に言えば、実際にはコンパイラ、JVM 実装、JIT、CPU アーキテクチャなどに依存します。Java 仕様では、このような場合の実行時間に制限はありません。

于 2012-04-25T12:25:03.330 に答える
2

基本的なロジックに関しては、単一のシフトではるかに優れたパフォーマンスが得られます。

バージョンを使用するfor loopと、ループの反復ごとに、ループの終了条件がチェックされ、iインクリメントされ、ビットごとの演算が実行され、 に代入が行われxます。

1 回のシフトを使用する場合、1 回のビット演算が実行され、 に代入が行われxます。

他の人が言っているように、これは時期尚早の最適化のように思えます。

ただし、質問に答えるために、論理的には、最初の例は他の例よりも高速です。

つまり、言語とコンパイラによっては、コンパイラがfor loop常に 16 回実行され、コードの最適化に進み、コードを に変更することを確認する可能性がありますx << 16。この場合、指定した各コード例に違いはありません。

于 2012-04-25T12:30:11.923 に答える
1

簡単なベンチマークを書いて、自分の目で確かめてみませんか?

    long start1 = System.nanoTime();
    for (int k = 0; k < 100000000; k++) {
        int x = 5;
        x = x << 16;
    }
    long stop1 = System.nanoTime();

    long start2 = System.nanoTime();
    for (int k = 0; k < 100000000; k++) {
        int x = 5;
        for (int i = 0; i < 16; ++i) {
            x = x << 1;
        }
    }
    long stop2 = System.nanoTime();

    long start3 = System.nanoTime();
    for (int k = 0; k < 100000000; k++) {
        int x = 5;
        for (int i = 0; i < 16; ++i) {
            x = x * 2;
        }
    }
    long stop3 = System.nanoTime();

    System.out.println(stop1 - start1);
    System.out.println(stop2 - start2);
    System.out.println(stop3 - start3);
于 2012-04-25T12:31:09.220 に答える
0

私は最初のものを使用します。
しかし、それはおそらくかなり同じです。
JVMにはこのための命令が組み込まれていると思うので、最初の方が速いかもしれません.

これらの小さな「速度向上」についてはあまり考えるべきではありません。これらの小さな算術/論理演算の速度は非常に高く、プログラムのパフォーマンスに大きな影響を与えることはありません。

于 2012-04-25T12:32:30.957 に答える