2009-03-15 2 views
25

newInstance()를 호출 할 때 패널티가 있습니까? 아니면 같은 메커니즘입니까? newInstance()가 new 키워드 *를 초과하면 얼마나 많은 오버 헤드가 발생합니까?newInstance() vs new

* : newInstance()가 리플렉션을 사용한다는 사실을 할인합니다.

답변

15

실제 테스트에서 "Constuctor.newInstance"를 통해 10 개의 인수 -vs를 통해 클래스의 18129 인스턴스를 생성하면 "new"를 통해 인스턴스를 생성 할 때 프로그램에서 시간에 측정 가능한 차이가 없었습니다.

이것은 마이크로 벤치 마크가 아닙니다.

Windows 7 x86 베타의 JDK 1.6.0_12와 함께 사용됩니다.

Constructor.newInstance가 Class.forName.newInstance와 매우 비슷할 것이라는 점을 감안할 때 오버 헤드는 새로운 것보다 newInstance를 사용하여 얻을 수있는 기능이 거의 없다고 가정합니다.

언제나처럼 스스로 테스트해야합니다.

+1

http://www.ibm.com/developerworks/java/library/j-jtp02225.html을 확인하십시오. 이러한 종류의 벤치 마크는 코드가 컴파일/최적화 된 동적 방법으로 인해 매우 어려울 수 있습니다. JVM. – Eddie

+0

내가 말했듯이, 그것은 실제 세계의 예이며 마이크로 벤치 마크가 아닙니다 ... – TofuBeer

1

microbenchmarks에주의해야하지만 this blog entry 누군가가 new이 JDK 1.4의 경우 newInstance보다 두 배 빠름을 발견했습니다. 차이가있는 것처럼 들리지만 예상대로 반사가 느립니다. 그러나 새 오브젝트 인스턴스의 빈도와 계산의 양에 따라 차이가 딜 브레이커가 아닐 수도 있습니다.

+0

반사가 빠른 자바의 각 릴리스와 gooten있다. – TofuBeer

+0

그래, 실제로, 내가 발견 한 벤치 마크에서 1.4의 사용을 언급 한 이유가 바로 그 때문입니다. 나는 newInstance가 여전히 느리다는 것을 확신하지만, 그것이 큰 차이라면 놀랄 것이다. – Eddie

+0

생성자에서 setAccessible (true)를 호출하면 약간 더 빨라지지만 (그래도 보안은 확실해야합니다). 물론, 나는 가능하다면 반사를 피하는 것이 좋습니다. –

-1

10 배의 차이가 있습니다. 절대적인 차이는 작지만 쓰기 대기 시간이 짧은 응용 프로그램 누적 CPU 시간이 상당 할 수 있습니다.

long start, end; 
    int X = 10000000; 
    ArrayList l = new ArrayList(X); 
    start = System.nanoTime(); 
    for(int i = 0; i < X; i++){ 
     String.class.newInstance(); 
    } 
    end = System.nanoTime(); 
    log("T: ", (end - start)/X); 

    l.clear(); 
    start = System.nanoTime(); 
    for(int i = 0; i < X; i++){ 
     new String(); 
    } 
    end = System.nanoTime(); 
    log("T: ", (end - start)/X); 

출력 :

T: 105 
T: 11 

제온 W3565의 @ 3.2GHz에는에서 테스트

, 자바 1.6

+3

이 코드를주의 깊게 살펴 보겠습니다. 런타임 중에 java optimizer는 새로운 String() 실행을 중지합니다. 그렇게하면 부작용이 발생하지 않기 때문입니다. 그것은 reflection이기 때문에 String.class.newInstance()에 대해 동일한 작업을 수행하지 않으며 newInstance 팩토리 클래스에 부작용이 있는지 여부를 알 수 없습니다. – cmdematos