정적 최종 필드가 많은 자바 클래스 (ThatClass
)를 가정하고 (그 중 아무 필드도 값 필드가 없음) 많은 필드에 액세스하는 것으로 가정합니다. 우리가 부를 클래스 ThisClass
. 메모리 사용과 성능이 모두 중요한 상황이라면, ThisClass
의 메서드 내에서 사용되는 ThatClass
의 static final 필드를 필드로 저장하는 것이 가치가 있습니까? ThisClass
?자바에서는 클래스의 필드에 다른 클래스의 필드를 저장하는 것이 합당한가요?
예 :
public class ThatClass
{
public static final Foo field1 = new Foo();
public static final Foo field2 = new Foo();
public static final Foo field3 = new Foo();
}
//implementation A
public class ThisClass
{
public ThisClass()
{
for (int i = 0; i < 20; ++i)
{
Bar(ThatClass.field1, ThatClass.field2, ThatClass.field3);
}
}
public void Bar(Foo arg1, Foo arg2, Foo arg3)
{
// do something.
}
/* imagine there are even other methods in ThisClass that need to access the
* fields of ThatClass.
*/
}
지금 ThisClass
//implementation B
public class ThisClass
{
private final Foo myField1;
private final Foo myField2;
private final Foo myField3;
public ThisClass()
{
myField1 = ThatClass.field1;
myField2 = ThatClass.field2;
myField3 = ThatClass.field3;
for (int i = 0; i < 20; ++i)
{
Bar(myField1, myField2, myField3);
}
}
public void Bar(Foo arg1, Foo arg2, Foo arg3)
{
// do something.
}
/* imagine there are even other methods in ThisClass that need to access the
* fields of ThatClass.
*/
}
내가 구현 B의 방법
Bar
에 대한 인수로 세 개의 필드를 통과 할 필요가 없습니다 것 알고
하지만, 대한의 다른 구현 이 토론의 목적으로, 이것이 필요하다고 상상해보십시오.
질문 :
은 두 가지 구현 사이의 성능에 관한 차이가 있나요? B가 A보다 빠릅니까?
메모리 비용과 관련하여 B는 A보다 많은 메모리를 요구합니까? 나는 그것을 상상할 수 있지만 조금 더 (각각의 참조가 정수의 크기가되는 각각의 참조 인 오른쪽의 크기는 각각의 추가 필드에 대해 하나의 추가 참조가 필요하다.)
감사! Russell이 말한 것과 +1
테스트를 구현하고 측정하십시오. 정적 필드 *에 액세스하기위한 오버 헤드가 캐시 미스를 포함 할 수 있지만 실제로는 측정 가능한 이점이 있는지 의심 스럽습니다. –
두 곳에서 필드를 복제하면 캐시 누락으로 인해 성능이 저하되고 메모리 사용이 증가합니다 . 정적 필드에 대한 액세스는 클래스에 있는지 여부와 관계없이 동일한 시간이 소요됩니다. –
성능 차이가 어디에서 오는 것으로 예상합니까? 동일한 참조를 다른 주소로 복사하는 중 어떻게 도움이 될 수 있습니까? –