fundo
Um fluxo de entrada de bits é apoiado por uma matriz de bytes. Existem vários métodos que lêem essa matriz de bytes em várias matrizes primitivas coagidas.
Problema
Existe um código duplicado. Java não possui genéricos em tipos primitivos, portanto, talvez a repetição seja inevitável.
Código
O código repetitivo é aparente nos seguintes métodos:
@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;
}
Observe como final byte[] out
se relaciona readByte(bits)
exatamente como final short[] out
se relaciona readShort(bits)
. Essas relações são o cerne do problema.
Questão
Como a duplicação pode ser eliminada, se é que existe, sem incorrer em um impacto significativo no desempenho (por exemplo, por autoboxing)?
Relacionado
java
arrays
code-duplication
Dave Jarvis
fonte
fonte
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Sim. (Geralmente, não é um problema, pois é raro um programa precisar de mais do que algumas primitivas diferentes. Você também pode "consertar" isso colocando as primitivas em uma classe e usando a serialização de objetos, embora isso possa ser relativamente lento. )ByteBuffer
métodos comoasDoubleBuffer()
ouasShortBuffer()
descarregará parte do trabalho de nível mais baixo. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…List<int>
etc. Liberte em talvez 2-5 anos ou mais. É chamado Projeto Valhalla.Respostas:
Se você estiver lendo primitivos em massa como o seu código parece indicar, o uso de métodos ByteBuffer como asDoubleBuffer () ou asShortBuffer () descarregará parte do trabalho de nível mais baixo.
Exemplo:
(O código é compilado, mas não testado!)
fonte
Uma possibilidade, que incorrerá em uma penalidade de desempenho, é usar
java.lang.reflect.Array
para tratar a matriz como um Objeto que permite reutilizar o mesmo código em todos os métodos de leitura.A duplicação foi abordada à custa de algum desempenho, uma pequena falta de segurança do tipo em tempo de compilação e uso de reflexão.
fonte