2013-04-21 3 views
2

메모리가 자주 호출되는 메서드 내에서 변수를 초기화해도 괜찮습니까? 는 기본적으로,이 예제 방법 :Java - 메모리 효율성을 위해 변수를 어디에서 초기화해야합니까?

int amount; 
private boolean method() { 
    amount = Random.nextInt(0, 100); 
    return amount == 50; 
} 

/더 적은을 /이 방법 메모리 효율성 측면에서 같은 :

private boolean method() { 
    int amount = Random.nextInt(0, 100); 
    return amount == 50; 
} 

그리고 그래, 나는이없는 가장 좋은 예입니다 알고, 그들에게 약간의 중복이 있음을 의미합니다. 미안합니다.

어쨌든, 사전에 감사합니다.

+1

인스턴스 변수 나 클래스 변수로 'amount'를 사용할 필요가 없다면 두 번째 방법이 더 좋습니다. – NINCOMPOOP

+0

로컬 변수는 항상 스택에 푸시되고 인스턴스 변수는 힙에 저장됩니다. – afk5min

+1

효율성을 높이고 프로그래밍 오류를 줄이기 위해 가능한 가장 좁은 범위를 갖도록 변수를 선언하는 것이 가장 좋습니다. (범위가 좁은 변수는 실수로 잘못 사용될 가능성이 적고 스레드 안전성이 높습니다.)하지만 효율성에 대해 염려가되는 경우 알고리즘과 사용하는 변수 유형이 영향을 미칠 가능성이 큽니다 . 예를 들어, 메소드의 임시 변수를 제거하고 컴파일러가 저장 영역을 최적화하도록 할 수 있습니다. –

답변

8

효율성의 차이가있는 경우, 완전히 무관 할 가능성이 높다. amount이 메소드 외부에 표시 될 필요가없는 경우 불필요한 부작용이없고 스레드로부터 안전하므로 두 번째 버전을 선호하십시오. 여러 스레드가 동일한 개체에 method()를 호출한다면

이, 마지막 지점에 확장하려면 첫 번째 버전은 경쟁 조건에 열려 있습니다.

0

동시 액세스으로 인해 오류에 대해 걱정할 것만 큼 나는 메모리 효율에 대해 정말로 걱정하지 않을 것입니다. 이 클래스는 인스턴스 변수의 amount은 다를 수 있습니다, 여러 인스턴스에서 사용되는

return amount == 50; 

. 적절한 기억 장벽이 없으면 이것은 잘못된 결과를 초래합니다. 로컬 변수 인 경우 메서드가 완료되면 int가 범위를 벗어납니다. 변수가 어쨌든 여기에 필요한 이유

, 말하자면? 이럴 수 없습니까?

return Random.nextInt(0, 100) == 50; 
+0

답변 해 주셔서 감사합니다. 그리고 예, 저는 중복성을 인정했습니다. 나는 더 좋은 예를 생각할 수 없었다. – Hat

0

로컬 변수는 메소드 내부에 있습니다. 각 변수의 범위를 가능한 작게 유지하는 것이 좋습니다. 그러나 둘 이상의 메소드가 변수에 액세스해야하는 경우 인스턴스 또는 클래스 변수를 정의하십시오.

1

두 번째 방법은 다른 방법으로 사용할 필요가없는 경우 더 나은; 스택에 할당 된 메소드 내부의 변수는 성능이 중요하지 않으므로 매우 빠릅니다.

그러나 특정 경우에이 방법은 더 나은 것, 그리고 좋은 IDE가 그것을 제안 :

private boolean method() {  
    return Random.nextInt(0, 100) == 50; 
} 
+0

답변 해 주셔서 감사합니다. 그리고 예, 저는 그것들이 최선의 가능한 예가 아니라는 것을 지적했습니다, 주로'amount' 변수가 중복되어 있기 때문입니다. – Hat

4

효과적인 자바 (제 2 판)에서 :

소리 architectual 원칙을 희생하지 마십시오 (예 : 정보 숨기기) 성능입니다.

항목 55 : 신중하게

  • 성능 사운드 아키텍처 원칙을 희생하지 마십시오 최적화합니다. 빠른 프로그램보다는 좋은 프로그램을 작성하려고 노력하십시오.
  • 좋은 프로그램은 정보 숨기기 원칙을 구현합니다. 가능한 경우 개별 모듈 내에서 디자인 결정을 현지화하므로 시스템의 나머지 부분에 영향을 미치지 않고 개별 결정을 변경할 수 있습니다.

과 :

항목 45 : 지역 변수의 범위를 최소화함으로써 지역 variabless

의 범위를 최소화, 당신의 가독성과 유지 보수성을 증가 코드를 수정하고 오류의 가능성을 줄이십시오.

C와 같은 이전 프로그래밍 언어에서는 블록의 머리 부분에서 지역 변수를 선언해야하며 일부 프로그래머는 습관적으로이를 계속 수행해야한다고 규정했습니다. 깨뜨릴 가치가있는 습관입니다. 온화한 알림으로서 Java는 선언문이 합법적 인 곳이면 어디에서나 변수를 선언 할 수 있습니다.

  • 선언하기 위해 로컬 변수의 범위를 최소화하는 가장 강력한 기법이 먼저 사용됩니다.

  • 거의 모든 지역 변수 선언에는 초기자가 포함되어야합니다.

그래서 가장 좋은 방법은 두 번째가 될 것으로 보인다.

관련 문제