Фон
Входной поток битов поддерживается массивом байтов. Есть несколько методов, которые читают из этого байтового массива в различные принудительные примитивные массивы.
проблема
Есть дублированный код. В 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;
}
Обратите внимание, как final byte[] out
относится к так readByte(bits)
же, как final short[] out
относится к readShort(bits)
. Эти отношения - суть проблемы.
Вопрос
Как можно устранить дублирование, если оно вообще не произошло, без значительного снижения производительности (например, с помощью автобокса)?
связанные с
java
arrays
code-duplication
Дейв Джарвис
источник
источник
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Ага. (Обычно это не большая проблема, поскольку одной программе редко требуется больше, чем несколько разных примитивов. Вы также можете «исправить» это, поместив примитивы в класс и используя сериализацию объектов, хотя это может быть относительно медленным. )ByteBuffer
таких методов, какasDoubleBuffer()
илиasShortBuffer()
будет снимать часть работы самого низкого уровня. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…List<int>
т. Е. И т. Д. Выпуск может быть через 2-5 лет или около того. Это называется Project Valhalla.Ответы:
Если вы читаете объемные примитивы , как ваш код , кажется, указывает, используя ByteBuffer методы , как asDoubleBuffer () или asShortBuffer () будет разгрузить часть самого низкого уровня работы.
Пример:
(Код компилируется, но не тестируется!)
источник
Одна возможность, которая повлечет за собой снижение производительности, заключается в использовании
java.lang.reflect.Array
массива как объекта, который затем позволяет повторно использовать один и тот же код во всех методах чтения.Дублирование было решено за счет некоторой производительности, незначительного отсутствия безопасности типа во время компиляции и использования отражения.
источник