In realtà, durante il test del codice relativo a OpenGL, ho scoperto che l'uso del modificatore finale su un campo privato può degradare le prestazioni. Ecco l'inizio della classe che ho testato:
public class ShaderInput {
private /* final */ float[] input;
private /* final */ int[] strides;
public ShaderInput()
{
this.input = new float[10];
this.strides = new int[] { 0, 4, 8 };
}
public ShaderInput x(int stride, float val)
{
input[strides[stride] + 0] = val;
return this;
}
// more stuff ...
E questo è il metodo che ho usato per testare le prestazioni di varie alternative, tra cui la classe ShaderInput:
public static void test4()
{
int arraySize = 10;
float[] fb = new float[arraySize];
for (int i = 0; i < arraySize; i++) {
fb[i] = random.nextFloat();
}
int times = 1000000000;
for (int i = 0; i < 10; ++i) {
floatVectorTest(times, fb);
arrayCopyTest(times, fb);
shaderInputTest(times, fb);
directFloatArrayTest(times, fb);
System.out.println();
System.gc();
}
}
Dopo la terza iterazione, con il riscaldamento della VM, ho ottenuto costantemente queste cifre senza l'ultima parola chiave:
Simple array copy took : 02.64
System.arrayCopy took : 03.20
ShaderInput took : 00.77
Unsafe float array took : 05.47
Con la parola chiave finale:
Simple array copy took : 02.66
System.arrayCopy took : 03.20
ShaderInput took : 02.59
Unsafe float array took : 06.24
Nota le figure per il test ShaderInput.
Non importava se rendessi i campi pubblici o privati.
Per inciso, ci sono alcune altre cose sconcertanti. La classe ShaderInput supera tutte le altre varianti, anche con la parola chiave finale. Questo è notevole b / c, fondamentalmente è una classe che avvolge un array float, mentre gli altri test manipolano direttamente l'array. Devo capirlo. Potrebbe avere qualcosa a che fare con l'interfaccia fluente di ShaderInput.
Anche System.arrayCopy sembra effettivamente un po 'più lento per array di piccole dimensioni rispetto alla semplice copia di elementi da un array all'altro in un ciclo for. E usando sun.misc.Unsafe (così come java.nio.FloatBuffer diretto, non mostrato qui) si esibisce in modo abissale.