Hintergrund
Ein Bit-Eingabestream wird durch ein Array von Bytes unterstützt. Es gibt eine Handvoll Methoden, die von diesem Byte-Array in verschiedene erzwungene primitive Arrays lesen.
Problem
Es gibt doppelten Code. In Java fehlen Generika für primitive Typen, daher ist die Wiederholung möglicherweise unvermeidbar.
Code
Der sich wiederholende Code wird bei den folgenden Methoden deutlich:
@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;
}
Beachten Sie, wie final byte[] out
sich auf readByte(bits)
genau wie final short[] out
bezieht readShort(bits)
. Diese Beziehungen sind der Kern des Problems.
Frage
Wie kann die Duplizierung, wenn überhaupt, beseitigt werden, ohne dass ein erheblicher Leistungseinbruch auftritt (z. B. durch Autoboxing)?
verbunden
java
arrays
code-duplication
Dave Jarvis
quelle
quelle
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Jep. (Normalerweise ist dies kein großes Problem, da ein Programm selten mehr als ein paar verschiedene Grundelemente benötigt. Sie können dies auch "beheben", indem Sie Grundelemente in eine Klasse einfügen und die Objekt-Serialisierung verwenden, obwohl dies relativ langsam sein kann. )ByteBuffer
Methoden wieasDoubleBuffer()
oderasShortBuffer()
werden einige der Arbeiten der untersten Ebene auslagern. docs.oracle.com/de/java/javase/11/docs/api/java.base/java/nio/…List<int>
Veröffentlichung in etwa 2-5 Jahren. Es heißt Projekt Valhalla.Antworten:
Wenn Sie Massenprimitive lesen, wie es Ihr Code anscheinend anzeigt, werden durch die Verwendung von ByteBuffer- Methoden wie asDoubleBuffer () oder asShortBuffer () einige der Arbeiten der untersten Ebene ausgelagert .
Beispiel:
(Code kompiliert, aber nicht getestet!)
quelle
Eine Möglichkeit, die zu einer Leistungsbeeinträchtigung führt, besteht darin
java.lang.reflect.Array
, das Array als Objekt zu behandeln, das dann die Wiederverwendung des gleichen Codes für alle Lesemethoden ermöglicht.Die Duplizierung wurde auf Kosten einer gewissen Leistung, eines geringfügigen Mangels an Sicherheit vom Typ zur Kompilierungszeit und der Verwendung von Reflexion behoben.
quelle