バックグラウンド
ビット入力ストリームは、バイトの配列に支えられています。そのバイト配列からさまざまな強制プリミティブ配列に読み取るメソッドがいくつかあります。
問題
コードが重複しています。Javaはプリミティブ型のジェネリックを欠いているので、おそらく繰り返しは避けられません。
コード
反復的なコードは、次の方法で明らかになります。
@Override
public long readBytes(final byte[] out, final int offset, final int count, final int bits) {
final int total = offset + count;
assert out != null;
assert total <= out.length;
final long startPosition = position();
for (int i = offset; i < total; i++) {
out[i] = readByte(bits);
}
return position() - startPosition;
}
@Override
public long readShorts(final short[] out, final int offset, final int count, final int bits) {
final int total = offset + count;
assert out != null;
assert total <= out.length;
final long startPosition = position();
for (int i = offset; i < total; i++) {
out[i] = readShort(bits);
}
return position() - startPosition;
}
どのように注意final byte[] out
することに関するreadByte(bits)
同じようfinal short[] out
にも関しますreadShort(bits)
。これらの関係は問題の核心です。
質問
(オートボクシングなどによって)パフォーマンスに大きな影響を与えることなく、重複を排除するにはどうすればよいでしょうか。
関連した
6
いいえ、そこでは何もできません。複製が唯一のオプションです。
—
アンディターナー
サードパーティのプリミティブコレクションを使用する
—
Vince Emigh
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
うん。(1つのプログラムが複数のプリミティブを必要とすることはまれであるため、通常はそれほど問題ではありません。クラス内にプリミティブを配置し、オブジェクトのシリアル化を使用することでこれを「修正」することもできますが、比較的遅い場合があります。 )
あなたのコードが示すように見えるように、バルクプリミティブを読んで使用している場合も、(これだけのことを思い出した)
—
markspace
ByteBuffer
のようなメソッドをasDoubleBuffer()
またはasShortBuffer()
最低レベルの作業の一部をオフロードします。 docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/...
Javaにプリミティブな一般的なサポートを提供するためのいくつかの取り組みがあることに注意してください
—
ザブザード
List<int>
。これはProject Valhallaと呼ばれます。