2013-05-15 2 views
-1

Java 및 C++에서 작은 테스트를 실행하여 매우 작은 오브젝트 (클래스 멤버가 없으며 생성자가 없음)를 많이 생성했으며 Java가 분명 더 빠릅니다 (C++이 실제로 느린 것 같습니다). 나는 이것이 JVM과 관련이 있다고 생각하지만 어떤면에서?C++ 힙 할당이 Java 힙 할당에 비해 느린 이유는 무엇입니까?

편집 :

class foo{ 
    public: 
     foo(){} 
     ~foo(){} 
} 

을 그리고 자바 : C++로 (I 더 반원, 아무것도 생성자에서 수행하지 말했듯이) 내가 사용

클래스는 다음과 같이했다

public class Foo{ 
    public Foo(){} 
} 

내가 만든 작은 테스트는 단지 루프 (arround 1000000000 연속)에 많은 수의 객체를 할당하는 것이 었습니다. OpenJDK 구현을 통해 GCC 4.7.2 및 Java 1.7을 사용했습니다. 둘 다 Linux를 사용하는 동일한 시스템에서 구현되었습니다.

실제로 메모리 풀 할당과 관련이 있는데, 이는 JVM이 불필요한 메모리를 소유하고 있음을 나타냅니다.

실제로 JVM이 포인터 참조를 계산하고 메모리를 할당하는 속도가 느릴 것이라고 생각하기 때문에 혼란 스럽습니다.

+0

이 질문은 대답 할 수 없습니다. 그것은 C++ 컴파일러, JVM 버전, 벤치 마크 프로그램, 플랫폼 등에 따라 다릅니다. –

+0

핫스팟 (사용하고 있다고 가정)은 최적화 런타임입니다. 객체 메모리 할당은 이제 매우 빠르며, 무료입니다. 그러나, 나는 당신의 C++ 코드 나 어떤 컴파일러 구현을 사용하고 있는지 보지 못했기 때문에 그것이 얼마나 최적인지에 대해 언급 할 수 없다. –

+4

사과와 사과를 비교하지 않습니다. JVM은이 상황을 위해 미리 할당 된 메모리 풀을 사용합니다. C++은 그러한 구조에 대해 미리 빌드 된 기능을 가지고 있지 않으며 대신 _every_ 할당을 위해 OS 메모리 관리자를 쿼리합니다. 사람들이 C++에서 JVM이 무엇을하는지 (메모리 풀 할당 자)를 제공하는 시스템을 작성하는 것은 드문 일이 아닙니다. 또한, 이것은 합법적 인 질문이며 모든 downvotes 학사입니다. – David

답변

10

힙에 많은 작은 객체를 할당하면 자바의 런타임이 C++보다 훨씬 더 최적화 된 경우가 대부분입니다 (대부분의 주류 구현에서). new을 사용하여 C++에서 힙 객체를 할당 할 때마다 구현은 대개 OS (최소한 Linux 및 Windows와 같은 대부분의 주류 플랫폼)에서 시스템 호출을 작성합니다. Java에서는 일반적으로 JVM에서 제공하는 메모리 풀에서 할당하며, 이는 힙에 Java 객체를 할당하도록 특별히 설계되고 최적화되어 있습니다.

특수 메모리 풀 할당자를 사용하면 대부분의 상황에서 C++이 더 빠를 수 있습니다. (또한 C++은 스택에 객체를 할당하는 옵션을 제공합니다. 물론 이것보다 훨씬 빠릅니다.)

일반적으로 C++는 프로그램 할당 방법에 대한보다 세밀한 제어를 제공합니다 메모리를 관리합니다. JVM은 실제 Java 언어 스펙 인 requires heap-allocated objects과 가비지 콜렉션에 의해 제약을 받는다. 그러나 C++에서 힙에 많은 작은 객체를 할당해야하는 응용 프로그램을 작성하는 경우 메모리 풀 할당자를 사용하는 것이 좋습니다.