실제로 일부 OpenGL 관련 코드를 테스트하는 동안 개인 필드에서 최종 수정자를 사용 하면 성능 이 저하 될 수 있습니다 . 테스트 한 수업의 시작은 다음과 같습니다.
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 ...
그리고 이것은 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();
}
}
3 번 반복 한 후 VM이 예열 된 후 최종 키워드 없이 일관 되게이 수치 를 얻었습니다 .
Simple array copy took : 02.64
System.arrayCopy took : 03.20
ShaderInput took : 00.77
Unsafe float array took : 05.47
으로 최종 키워드 :
Simple array copy took : 02.66
System.arrayCopy took : 03.20
ShaderInput took : 02.59
Unsafe float array took : 06.24
ShaderInput 테스트 수치를 참고하십시오.
필드를 공개 또는 비공개로 설정했는지는 중요하지 않았습니다.
덧붙여서, 몇 가지 더 당황스러운 것들이 있습니다. ShaderInput 클래스는 final 키워드를 사용하더라도 다른 모든 변형보다 성능이 뛰어납니다. 이것은 기본적으로 float 배열을 감싸는 클래스이며 다른 테스트 는 배열을 직접 조작합니다. 이것을 알아 내야합니다. ShaderInput의 유창한 인터페이스와 관련이있을 수 있습니다.
또한 System.arrayCopy는 실제로 작은 배열의 경우 for 루프에서 단순히 한 배열에서 다른 배열로 요소를 복사하는 것보다 다소 느립니다. 그리고 sun.misc.Unsafe (및 여기에 표시되지 않은 직접 java.nio.FloatBuffer)를 사용하면 아주 작습니다.