2013-02-23 4 views
2

첫 번째 예제는 Java/Android와 일반적으로 Java에서 두 번째보다 효율적인 코드 을 생성합니까?Java/Android에서 변수를 추가하는 더 좋은 방법은 무엇입니까?

적어도 첫 번째 예는

나는 변수 V는 아마도 긴 시간 동안 메모리를 먹고, 첫 번째 예에서 시간이 오래 살 수 있다는 것을 여기 상관 없어 .. 내가 생각하기에, 두 번째보다 느릴 수 없습니다 .

물론 여러 내부 블록이있는 더 복잡한 코드를 사용하는 경우 두 번째 방법이 더 읽기 쉽습니다. 물론 입니다. 여기에서도 문제가되지 않습니다. v 변수 범위가 for 루프 내부에 있기 때문에

MyType v; 
for(int i=0;i<bigCount;++i) 
{ 
    v = <value produced for i>; 
    //do something with v 
} 


for(int i=0;i<bigCount;++i) 
{ 
    MyType v = <value produced for i>; 
    //do something with v 
} 
+1

어쩌면 코드를 검사하여 두 루프의 시간 경과 및 메모리 사용을 측정 해보십시오. – lelloman

+1

가장 깨끗한 코드 (즉, 두 번째 코드)를 작성하십시오. 대부분의 경우, 가장 깨끗한 코드는 더 빠른 코드를 의미합니다. 그리고이 경우에는 마이크로 최적화가 큰 영향을 미치지 않는다고 생각합니다. –

답변

2

나는 두 번째 옵션을 선택합니다. 외부 어디에서도 사용할 필요가 없습니다.

이렇게하면 v으로 생성되고 할당 된 개체는 더 일찍 가비지 수집 대상이됩니다. 또는 적어도 마지막 코드는 첫 번째 코드보다 더 빨리 자격이 부여됩니다. 여러 할당을 방지하기 위해

+0

첫 번째 경우에는 GC에 적합하지 않다고 말한 적이 없습니다. 방금 첫 번째 경우에는 일찍 자격이 있다고했습니다. –

+1

실제로 이것은 항상 사실이 아닙니다. ORACLE을 포함한 많은 JVM 구현은 [보이지 않는 참조 (Invisible references)] (http://192.9.162.55/docs/books/performance/1st_edition/html/JPAppGC.fm.html)가 존재하게합니다. 실제로 이것은 매우 드물지만 가능합니다. Java 언어 변수 범위의 의미에서 범위를 벗어나는 참조가 항상 구현의 범위를 벗어나는 것은 아닙니다 (JVM에 변수를 저장하는 실제 저수준 스택). 대부분의 경우 나는 그런 미묘한 스타일보다는 코딩 스타일에 더 신경을 썼다. –

0

, 당신은 이런 식으로 자신의 범위에 변수를 닫을 수 있습니다 :

{ 
    MyType v; 
    for(int i=0;i<bigCount;++i) 
    { 
    v = <value produced for i>; 
    //do something with v 
    } 
} 

v

1

내가 최소한의 예를 만든이 블록 후 GC에 의해 수집됩니다

public void option1() { 
    String s; 
    for (int i = 0; i < foo; i++) { 
     s = String.valueOf(i); 
    } 
} 

public void option2() { 
    for (int i = 0; i < foo; i++) { 
     String s = String.valueOf(i); 
    } 
} 

그리고 생성 된 바이트 코드가 모두 동일 함을 발견

option1() :

0 iconst_0 
1 istore_2 
2 goto 13 (+11) 
5 iload_2 
6 invokestatiC#17 <java/lang/String/valueOf(I)Ljava/lang/String;> 
9 astore_1 
10 iinc 2 by 1 
13 iload_2 
14 aload_0 
15 getfield #23 <MethodTest/foo I> 
18 if_icmplt 5 (-13) 
21 return 

option2() : 컴파일러가 보는 경우

0 iconst_0 
1 istore_1 
2 goto 13 (+11) 
5 iload_1 
6 invokestatiC#17 <java/lang/String/valueOf(I)Ljava/lang/String;> 
9 astore_2 
10 iinc 1 by 1 
13 iload_1 
14 aload_0 
15 getfield #23 <MethodTest/foo I> 
18 if_icmplt 5 (-13) 
21 return 

내 생각은, 루프 이전에 생성 된 변수는 루프 후 사용되지 않습니다 것을, 그냥 끌어 내린다 그것은 루프에 대한 정의입니다. 따라서 귀하의 경우 어느 쪽도 더 효율적이지 않습니다. 그러니 가독성이 높은 것으로 이동하십시오 (option2()).

관련 문제