tło
Bitowy strumień wejściowy jest wspierany przez tablicę bajtów. Istnieje kilka metod, które odczytują z tej tablicy bajtów na różne wymuszone pierwotne tablice.
Problem
Istnieje zduplikowany kod. W Javie brakuje generycznych typów pierwotnych, więc być może powtórzenie jest nieuniknione.
Kod
Powtarzalny kod jest widoczny w następujących metodach:
@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;
}
Zwróć uwagę, jak final byte[] out
odnosi się do readByte(bits)
tak, jak final short[] out
odnosi się do readShort(bits)
. Relacje te stanowią sedno problemu.
Pytanie
Jak można wyeliminować duplikację, jeśli w ogóle, bez znacznego spadku wydajności (np. Przez autoboxing)?
Związane z
java
arrays
code-duplication
Dave Jarvis
źródło
źródło
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Tak. (Zwykle nie stanowi to większego problemu, ponieważ jeden program potrzebuje więcej niż kilku różnych prymitywów. Można to również „naprawić”, umieszczając prymitywy w klasie i stosując serializację obiektów, chociaż może to być stosunkowo wolne. )ByteBuffer
metod takich jakasDoubleBuffer()
lubasShortBuffer()
spowoduje odciążenie części pracy na najniższym poziomie. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…List<int>
. Wydanie może za około 2-5 lat. Nazywa się Project Valhalla.Odpowiedzi:
Jeśli czytasz zbiorcze operacje podstawowe, jak wydaje się to wskazywać Twój kod, użycie metod ByteBuffer , takich jak asDoubleBuffer () lub asShortBuffer (), odciąży część pracy na najniższym poziomie.
Przykład:
(Kod kompiluje się, ale nie został przetestowany!)
źródło
Jedną z możliwości, która może spowodować obniżenie wydajności, jest
java.lang.reflect.Array
traktowanie tablicy jako obiektu, który następnie pozwala na ponowne użycie tego samego kodu we wszystkich metodach odczytu.Problem duplikacji został rozwiązany kosztem pewnej wydajności, niewielkiego braku bezpieczeństwa typu kompilacji i użycia refleksji.
źródło