Latar Belakang
Input stream bit didukung oleh array byte. Ada beberapa metode yang membaca dari array byte itu ke berbagai array primitif yang dipaksakan.
Masalah
Ada kode duplikat. Java tidak memiliki generik pada tipe primitif, jadi mungkin pengulangan tidak dapat dihindari.
Kode
Kode berulang terlihat dalam metode berikut:
@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;
}
Perhatikan bagaimana final byte[] out
berhubungan dengan readByte(bits)
seperti final short[] out
berkaitan dengan readShort(bits)
. Hubungan-hubungan ini adalah inti masalahnya.
Pertanyaan
Bagaimana duplikasi dapat dihilangkan, jika sama sekali, tanpa menimbulkan hit kinerja yang signifikan (misalnya, dengan autoboxing)?
Terkait
java
arrays
code-duplication
Dave Jarvis
sumber
sumber
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Ya. (Biasanya itu tidak banyak masalah, karena jarang satu program membutuhkan lebih dari beberapa primitif yang berbeda. Anda juga bisa "memperbaiki" ini dengan meletakkan primitif di dalam kelas dan menggunakan serialisasi objek, meskipun itu bisa relatif lambat. )ByteBuffer
metode sepertiasDoubleBuffer()
atauasShortBuffer()
akan membongkar beberapa pekerjaan tingkat terendah. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…List<int>
dll. Rilis dalam mungkin 2-5 tahun atau lebih. Ini disebut Project Valhalla.Jawaban:
Jika Anda membaca primitif massal seperti kode Anda tampaknya menunjukkan, menggunakan metode ByteBuffer seperti asDoubleBuffer () atau asShortBuffer () akan mengeluarkan beberapa pekerjaan tingkat terendah.
Contoh:
(Kode mengkompilasi tetapi tidak diuji!)
sumber
Satu kemungkinan, yang akan dikenakan penalti kinerja, adalah menggunakan
java.lang.reflect.Array
untuk memperlakukan array sebagai Objek yang kemudian mengizinkan penggunaan kembali kode yang sama di semua metode yang dibaca.Duplikasi telah ditangani dengan mengorbankan beberapa kinerja, kurangnya jenis keamanan waktu kompilasi, dan penggunaan refleksi.
sumber