7

すべてのバイト値 (-128 から 127 まで) を反復処理する必要があります。イテレータを使用できますintが、毎回 にキャストする必要がありますbyte。イテレータを使用すると、オーバーフローするbyteためテストできないという問題があります。b < 128while ループを使用して、インクリメントする前にテストを行うことを考えました。これが、これまでのところ私の最善の解決策です。より良いアプローチはありますか?

4

2 に答える 2

10

Java バイトは署名されているため、値は -128 から 127 です。とにかく、キャストやそのような追加のチェックについて心配する必要はありません。実際、JVM レベルでは、バイト変数のようなものはありません。とにかくintとして扱われます。

于 2012-06-30T00:10:08.377 に答える
3

バイト反復子を使用すると、b < 128 をテストできないという問題があります

b == 127ループ終了条件としてテストします。

intただし、使用してもbyteパフォーマンスの観点から見ても、おそらく違いはないという Antimon の意見に同意します。バイトコード レベルでは、JVM は 32 ビットと 64 ビットの整数算術演算子のみを提供します。

byte言語レベルでは、ケースだけでなくケースでも型変換が行われると思いますintb++それが実際に同等であると考えてください

    byte b = ...;
    b = (byte) (b + 1);

b + 1値を生成するため、型キャストはヌープではありませんint。そう

    for (byte b = -128; b != 127; b++) {
        ...
    }

概念的な型キャストが含まれています。これがパフォーマンスの観点から何かを意味するかどうかは議論の余地があります。なぜなら、JIT はネイティブ コードを生成するときに不要な操作を最適化するために多くの作業を行うからです。


最後に、Java でのマイクロ最適化に関する標準的なポイント:

  • コードのプロファイリングをまだ行っていない場合は、重要でないことを調整しようとして時間を無駄にしている可能性があります。
  • どちらが速いかについての直感やアドバイスではなく、実際の測定 (つまり、アプリケーションのベンチマーク) に頼るべきです。あなたの直感が間違っていることが証明されるように準備してください。
  • マイクロ最適化によってかなりのスピードアップが得られたとしても、スピードアップはプラットフォーム固有である可能性が高いことに注意してください。実際、あるプラットフォームでの改善は、別のプラットフォームでは遅くなる可能性があります。
于 2012-06-30T01:49:18.190 に答える