2013-05-24 3 views
5

저는 최근에 C++과 Java에서도 "최상의"직렬화 프레임 워크를 찾으려고 일부 벤치 마크를 실행 해 왔습니다. 나를 위해 "최선"을 구성하는 요소는 직렬화 된 객체의 결과 크기와 입니다.직렬화 - C++과 Java의 차이점

Java의 다양한 프레임 워크 결과를 보면 결과 바이트 []가 일반적으로 메모리의 오브젝트 크기보다 작다는 것을 알 수 있습니다. Java 직렬화가 내장 된 경우에도 마찬가지입니다. 그런 다음 다른 제품 (protobuf 등)을 보면 크기가 훨씬 줄어 듭니다.

나는 C++ 크기 (boost, protobuf)의 것들을 보았을 때 결과 객체가 일반적으로 원래 객체보다 작지는 않지만 (어떤 경우에는 더 크다) 매우 놀랐다.

여기에 뭔가가 있습니까? C++이 아닌 Java에서 무료로 "압축"을 얻는 이유는 무엇입니까? 자바에있는 개체의 크기를 측정하는

n.b, 나는 http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html

+0

long getObjectSize (Object objectToSize) 지정된 객체가 사용하는 저장소 크기에 대한 구현 별 근사값을 반환합니다. 결과에는 객체의 오버 헤드의 일부 또는 전부가 포함될 수 있으므로 구현 내에서의 비교에는 유용하지만 구현 간의 비교에는 유용하지 않습니다. JVM을 한 번 호출하는 동안 예상치가 변경 될 수 있습니다. – user2384396

답변

3

당신은 데이터의 절대 크기를 비교 했 계측 사용하고 있습니다? 나는 자바가 더 많은 오버 헤드를 가지고 있다고 말할 것이다. 따라서 직렬화 된 버퍼로 데이터를 "압축"하면 오버 헤드가 훨씬 더 줄어든다. C/C++에서는 물리적 데이터 크기에 대해 거의 요구하지 않아 압축 할 공간이별로 없습니다. 사실, 그것을 역 직렬화하기 위해 추가 정보를 추가해야합니다. 이로 인해 성장할 수도 있습니다.

+0

자바에서 객체 크기를 측정하는 방법을 보여주기 위해 게시물을 업데이트했습니다. 자바에서 더 나은 직렬화가 아니라는 것을 의미합니까? C++에서 메모리의 객체 표현이 훨씬 뛰어납니다. – imrichardcole

+0

@imrichardcole, 예, 그게 무슨 뜻입니까. 검색된 객체를 문자열로 덤핑 한 다음 결과를 비교하여 실제로 발생하는 것을 확인할 수 있습니다. 이는 이것이 내 가정 일뿐입니다. – Devolus

1

데이터 멤버 간의 오프셋 비트로 인해 개체 크기가 실제 데이터 크기보다 커질 수 있습니다.

개체를 직렬화하면 이러한 오프셋 비트가 삭제되고 직렬화 된 개체 메모리가 더 작아집니다.

자바는 관리 환경이므로 메모리와 소유권을 제어하기 위해 더 많은 오프셋 데이터가 필요하므로 압축률이 더 높습니다.

관련 문제