Dav*_*vis 9 java arrays code-duplication
位输入流由字节数组支持。有一些方法可以从该字节数组读取到各种强制原始数组。
有重复的代码。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;
}
Run Code Online (Sandbox Code Playgroud)
注意如何final byte[] out
涉及到readByte(bits)
同样final short[] out
涉及readShort(bits)
。这些关系是问题的症结所在。
如何消除重复,如果有的话,又不会导致显着的性能损失(例如,通过自动装箱)?
如果您正在阅读像代码所示的批量原语,那么使用asDoubleBuffer()或asShortBuffer()等ByteBuffer方法将减轻一些最低级别的工作。
例子:
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`
}
Run Code Online (Sandbox Code Playgroud)
(代码可以编译但未经测试!)
归档时间: |
|
查看次数: |
174 次 |
最近记录: |