1

string concat2つのアプローチのうち、最初のアプローチにはとに関連するパフォーマンスの問題があったようtoCharArrayです。しかし、これらの操作は両方ともコンパイル時に行われるため、パフォーマンスのオーバーヘッドはないと言われました。

これが本当なら、コンパイル時の操作がパフォーマンスのオーバーヘッドではないのはなぜですか?

private final static char[] DigitTens = {
     ("0000000000"+ "1111111111"+"2222222222"+"3333333333"+"4444444444" //
     +"5555555555"+"6666666666"+"7777777777"+"8888888888"+"9999999999")
      .toCharArray();             
};

VS:

private final static char[] DigitTens = {
    '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
    '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
    '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
    '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
    '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
    '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
    '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
    '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
    '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
    '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
};
4

3 に答える 3

3

+sを使用した文字列連結式は定数式であり、コンパイル時に解決されます (JLS §15.28)。ただし、toCharArray()呼び出しは実行時に実行されます。全体として、最初のスニペットは次のようになります。

private final static char[] DigitTens;

static {
    DigitTens = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
            .toCharArray();
}

そして、2番目のスニペットは次と同等です:

private final static char[] DigitTens;

static {
    DigitTens = new char[100];
    DigitTens[0] = '0';
    DigitTens[1] = '0';
    ...
    DigitTens[99] = '9';
}

(これは、を介してバイトコードで自分で確認できますjavap -c)

最終的に、ここではパフォーマンスについて心配する必要はありません。おそらく違いはわかりません。より明確で管理しやすいと思われるものを選択してください。多くの場合、コードのコンパイルにかかる時間は重要ではありません。コンパイル ステージは実際には 1 回だけ実行する必要があり、その後.classはバイトコードを含む生成されたファイルを処理する必要があるためです。

また、この特定のケースでは、 が0 ~ 99 の範囲にあると仮定して、DigitTens[i]単純にであることも指摘しておきます。i / 10i

于 2013-10-04T16:08:09.533 に答える
1

これに答えるには

これが本当なら、コンパイル時の操作がパフォーマンスのオーバーヘッドではないのはなぜですか?

彼らです。ただし、それらはプログラムの作成ごとに 1 回だけ発生し、プログラムの実行中に発生することはありません。

コンパイラのパフォーマンスについて心配する必要はなかったと思います (ビルドの全体的な構造を見る以外に)。明確にするためにコーディングし、問題にならない限りパフォーマンスについては心配しません。同じことが実行時のパフォーマンスにも当てはまります。

于 2013-10-04T16:05:26.473 に答える
0

「コンパイル時間」のパフォーマンス オーバーヘッドは開発者に影響を与え、生涯にわたって 1 ミリ秒も無駄にする可能性があります。

実行時のパフォーマンス オーバーヘッドは 1 秒間に x 回発生する可能性があり、かなりのコストがかかります。

あなたの特定の例に関しては、実行時に toCharArray を呼び出す必要がないため、2番目のアプローチはわずかに効率的です(おそらく明確さを犠牲にして)。

于 2013-10-04T16:08:13.657 に答える