すべてのバイト値 (-128 から 127 まで) を反復処理する必要があります。イテレータを使用できますint
が、毎回 にキャストする必要がありますbyte
。イテレータを使用すると、オーバーフローするbyte
ためテストできないという問題があります。b < 128
while ループを使用して、インクリメントする前にテストを行うことを考えました。これが、これまでのところ私の最善の解決策です。より良いアプローチはありますか?
質問する
1942 次
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
言語レベルでは、ケースだけでなくケースでも型変換が行われると思いますint
。b++
それが実際に同等であると考えてください
byte b = ...;
b = (byte) (b + 1);
b + 1
値を生成するため、型キャストはヌープではありませんint
。そう
for (byte b = -128; b != 127; b++) {
...
}
概念的な型キャストが含まれています。これがパフォーマンスの観点から何かを意味するかどうかは議論の余地があります。なぜなら、JIT はネイティブ コードを生成するときに不要な操作を最適化するために多くの作業を行うからです。
最後に、Java でのマイクロ最適化に関する標準的なポイント:
- コードのプロファイリングをまだ行っていない場合は、重要でないことを調整しようとして時間を無駄にしている可能性があります。
- どちらが速いかについての直感やアドバイスではなく、実際の測定 (つまり、アプリケーションのベンチマーク) に頼るべきです。あなたの直感が間違っていることが証明されるように準備してください。
- マイクロ最適化によってかなりのスピードアップが得られたとしても、スピードアップはプラットフォーム固有である可能性が高いことに注意してください。実際、あるプラットフォームでの改善は、別のプラットフォームでは遅くなる可能性があります。
于 2012-06-30T01:49:18.190 に答える