2013-05-24 43 views
5

Gần đây tôi đã chạy một số tiêu chuẩn cố gắng tìm các khung công tác tuần tự hóa "tốt nhất" cho C++ và cũng trong Java. Các yếu tố tạo nên "tốt nhất" cho tôi là tốc độ của de/serializing và cũng là kích thước kết quả của đối tượng được tuần tự hóa.Serialization - sự khác biệt giữa C++ và Java

Nếu tôi xem kết quả của các khung công tác khác nhau trong Java, tôi thấy rằng byte kết quả [] thường nhỏ hơn kích thước đối tượng trong bộ nhớ. Điều này thậm chí là trường hợp với việc xây dựng tuần tự Java. Nếu bạn sau đó xem xét một số các dịch vụ khác (protobuf, vv) thì kích thước sẽ giảm nhiều hơn.

Tôi khá ngạc nhiên khi nhìn vào mọi thứ trên kích thước C++ (tăng, protobuf) mà đối tượng kết quả thường không nhỏ hơn (và trong một số trường hợp lớn hơn) so với đối tượng ban đầu.

Tôi có thiếu gì đó ở đây không? Tại sao tôi nhận được một số tiền hợp lý của "nén" miễn phí trong Java nhưng không phải trong C + +?

n.b để đo kích thước của các đối tượng trong Java, Tôi đang sử dụng Instrumentation http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html

+0

getObjectSize dài (Object objectToSize) Trả về xấp xỉ xấp xỉ về dung lượng lưu trữ được sử dụng bởi đối tượng được chỉ định. Kết quả có thể bao gồm một số hoặc tất cả các chi phí của đối tượng, và do đó rất hữu ích để so sánh trong một quá trình thực hiện nhưng không phải giữa các lần triển khai. Ước tính có thể thay đổi trong một lần gọi đơn lẻ của JVM. – user2384396

Trả lời

3

Bạn có so sánh kích thước tuyệt đối của dữ liệu? Tôi sẽ nói rằng Java có nhiều chi phí hơn, vì vậy nếu bạn "nén" dữ liệu vào một bộ đệm được tuần tự hóa, thì lượng chi phí đầu vào sẽ giảm nhiều hơn. Trong C/C++ bạn có gần như tối thiểu cần thiết cho kích thước dữ liệu vật lý, do đó không có nhiều chỗ để nén. Và trên thực tế, bạn phải thêm thông tin bổ sung để deserialize nó, mà thậm chí có thể dẫn đến tăng trưởng.

+0

Tôi đã cập nhật bài đăng để hiển thị cách tôi đang đo kích thước đối tượng trong Java. Bạn có nghĩa là, nó không phải là serialization đó là tốt hơn trong Java, đó là một thực tế là đại diện đối tượng trong bộ nhớ là tốt hơn nhiều trong C + +? – imrichardcole

+0

@imrichardcole, Vâng, đó là ý của tôi. Bạn có thể đổ đối tượng searialized vào một chuỗi và sau đó so sánh kết quả để xem những gì đang thực sự xảy ra, vì đây chỉ là giả định của tôi. – Devolus

1

Kích thước đối tượng có thể quan sát được lớn hơn kích thước dữ liệu thực tế do các bit bù đắp giữa các thành viên dữ liệu.

Khi một đối tượng được tuần tự hóa, các bit bù này sẽ bị loại bỏ và do đó, bộ nhớ đối tượng được tuần tự sẽ nhỏ hơn.

Vì java là một môi trường được quản lý, cần nhiều dữ liệu bù đắp hơn để kiểm soát bộ nhớ và quyền sở hữu, do đó, tỷ lệ nén của chúng lớn hơn.

Các vấn đề liên quan