2009-01-25 7 views

답변

6

아니요 배열과 초기화를 구분할 수는 없습니다.

정확하게 벤치마킹을 시도하고 있습니까?

내가 물어 본 이유는 객체 할당 타이밍에 영향을주는 실행중인 JVM 내에서 변수의 위치 (할당 된 위치를 결정하는 객체의 크기)에서 무엇이 일어나고 있는지에 이르기까지 다양합니다. Hotspot이 코드가 아무 것도하지 않고 no-op로 대체 될 수 있는지 여부를 결정하는 동시에 JVM을 동시에 (객체 할당을 시작하면 다양한 세대 사이에 섞여 버립니다). 덧붙여

, 벤치마킹의 malloc()에 방해가 변수 비슷하지만 중복되지 않는 ...

+0

'새 Object [200]'은 공백을 할당하지 않지만 각 항목을 초기화하지 않은 채로 둡니까? – Cogsy

+0

아니요, 각 항목을 null 으로 초기화합니다. http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc.html#anewarray – kdgregory

+0

또는 구현 내용이 정확하면 메모리가 이미 초기화되었습니다. –

1

이 있습니다 당신은 당신이 발생하지 않습니다 뭔가를 벤치마킹 될이 작업을 수행 할 수 있다면 실제 프로그램을 사용하면 결과가 아무런 의미가 없습니다.

나는 이와 비슷한 작업을 수행했으며 할당에는 약 250 ns의 시간과 500 ns 이상의 10 %의 시간과 약 1,200 ns의 1 %의 시간이 소요된다는 것을 알게되었습니다.

이것은 프로세서 속도, 컴퓨터의 메모리 아키텍처 및 생성하려는 개체에 따라 다릅니다.

1

내가 할 수없는 이유 중 하나는 보안 모델 때문이라고 생각합니다.

+0

보안과 함께 Java를 사용할 필요는 없습니다. Java의 철학은 모든 것을 예측 가능하게 만드는 것입니다 (합리적으로 가능한 한 많이). 모든 것을 제로로 만드는 것은 그 중 일부입니다. –

0

당신이 할 수있는 유일한 방법은 JNI를 사용하는 것입니다. JNI를 사용하면 실제 Java 사용을 반영하지 않는 벤치 마크를 얻을 수 있습니다. 다른 사람들이 이미 제시 한 이유들 때문에. Java를 통한 모든 할당 ("new"를 통한)은 항상 메모리를 초기화합니다.

1

아마도 java.nio.ByteBuffer가 당신이 찾고있는 것입니다. 당신의 이유는 약간은 모호합니다 :-)

0

메모리의 초기화되지 않은 블록을 할당하는 방법은 없습니다. 은 "정상적인"할당/GC 메커니즘을 거칩니다.

당신이 무엇을 할 수 do는 (네이티브 메서드에서) 임의의 메모리 주소에서 직접 ByteBuffer를 구성합니다. 하지만 그것은 "정상적인"객체 처리에 대한 벤치 마크를 제공하지는 못합니다 (벤치마킹하려는 것이 정상적인 할당/할당 취소 일 경우, 왜 이것을 원 하느냐는 명확하지 않습니다).