デイブジャービス:
バックグラウンド
ビット入力ストリームは、バイトの配列によって補助されます。様々な強制プリミティブ配列にそのバイト配列から読み取る方法の一握りがあります。
問題
重複したコードがあります。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)
。これらの関係は、問題の核心です。
質問
どのように重複を排除することができ、すべての場合、大幅なパフォーマンスヒットを(例えば、オートボクシングによる)招くことなく?
関連
マーク・スペース:
あなたはバルクプリミティブを読んでいる場合は、あなたのコードが使用して、示しているようだのようなのByteBufferのようなメソッドをasDoubleBuffer()またはasShortBuffer()最下位レベルの作業の一部をオフロードします。
例:
public void readBytes( final byte[] out, final int offset, final int count, final ByteBuffer buffer ) {
buffer.get( out, offset, count ); // udates ByteBuffer `position` automatically
}
public void readShorts( final short[] out, final int offset, final int count, final ByteBuffer buffer ) {
ShortBuffer sb = buffer.asShortBuffer();
sb.get( out, offset, count ); // note that `count` reads two bytes for each `short`
}
(コードはコンパイルし、テストしません!)