Contexte
Un flux d'entrée de bits est soutenu par un tableau d'octets. Il existe une poignée de méthodes qui lisent ce tableau d'octets dans divers tableaux primitifs sous contrainte.
Problème
Il y a du code en double. Java manque de génériques sur les types primitifs, donc la répétition est peut-être inévitable.
Code
Le code répétitif est apparent dans les méthodes suivantes:
@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;
}
Notez comment se final byte[] out
rapporte à readByte(bits)
tout comme se final short[] out
rapporte à readShort(bits)
. Ces relations sont au cœur du problème.
Question
Comment la duplication peut-elle être éliminée, le cas échéant, sans encourir un impact significatif sur les performances (par exemple, par autoboxing)?
en relation
java
arrays
code-duplication
Dave Jarvis
la source
la source
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Ouaip. (Habituellement, ce n'est pas vraiment un problème, car il est rare qu'un programme ait besoin de plusieurs primitives différentes. Vous pouvez également "corriger" cela en plaçant des primitives dans une classe et en utilisant la sérialisation d'objets, bien que cela puisse être relativement lent. )ByteBuffer
méthodes commeasDoubleBuffer()
ouasShortBuffer()
déchargera certains des travaux de niveau le plus bas. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…List<int>
etc. Sortie dans environ 2 à 5 ans. Il s'agit du projet Valhalla.Réponses:
Si vous lisez des primitives en vrac comme votre code semble indiquer, en utilisant ByteBuffer méthodes comme asDoubleBuffer () ou asShortBuffer () déchargeront certains des travaux plus bas niveau.
Exemple:
(Le code se compile mais n'est pas testé!)
la source
Une possibilité, qui entraînera une baisse des performances, consiste à utiliser
java.lang.reflect.Array
pour traiter le tableau comme un objet qui permet ensuite de réutiliser le même code dans toutes les méthodes de lecture.La duplication a été corrigée au prix de certaines performances, d'un manque mineur de sécurité de type à la compilation et de l'utilisation de la réflexion.
la source