2013-03-26 2 views
0

정적 최종 필드가 많은 자바 클래스 (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에 대한 인수로 세 개의 필드를 통과 할 필요가 없습니다 것 알고

하지만, 대한의 다른 구현 이 토론의 목적으로, 이것이 필요하다고 상상해보십시오.

질문 :

  1. 은 두 가지 구현 사이의 성능에 관한 차이가 있나요? B가 A보다 빠릅니까?

  2. 메모리 비용과 관련하여 B는 A보다 많은 메모리를 요구합니까? 나는 그것을 상상할 수 있지만 조금 더 (각각의 참조가 정수의 크기가되는 각각의 참조 인 오른쪽의 크기는 각각의 추가 필드에 대해 하나의 추가 참조가 필요하다.)

감사! Russell이 말한 것과 +1

+3

테스트를 구현하고 측정하십시오. 정적 필드 *에 액세스하기위한 오버 헤드가 캐시 미스를 포함 할 수 있지만 실제로는 측정 가능한 이점이 있는지 의심 스럽습니다. –

+2

두 곳에서 필드를 복제하면 캐시 누락으로 인해 성능이 저하되고 메모리 사용이 증가합니다 . 정적 필드에 대한 액세스는 클래스에 있는지 여부와 관계없이 동일한 시간이 소요됩니다. –

+2

성능 차이가 어디에서 오는 것으로 예상합니까? 동일한 참조를 다른 주소로 복사하는 중 어떻게 도움이 될 수 있습니까? –

답변

1

+1. 또한 두 곳에서 필드를 정의하면 DRY principle (Wikipedia)에 위배됩니다. 매우 간단한 예제를 제공하지만 정적 필드 중 하나의 정의를 변경해야한다고 상상해보십시오. 두 번째 구현에서는 코드를 두 번 업데이트해야합니다. 동일한 필드에 대해 두 가지 정의가 있다는 것을 기억하고 있다고 가정합니다.

관련 문제