簡體   English   中英

Serializable和Externalizable(Java)之間的性能差異

[英]Performance difference between Serializable and Externalizable (Java)

我在高度分散的環境中工作。 很多網絡訪問和大量的數據庫訪問。

我有一些通過網絡發送的類,並且被序列化和反序列化。

大多數課程的性質非常簡單,例如:

class A{
    long a;
    long b;
}

有些更復雜(復合 - 收藏)。

我工作的公司中有一些人聲稱所有類都應該實現Externalizable而不是Serializable ,這將對應用程序的性能產生重大影響。

盡管對性能的影響很難衡量,但由於應用程序非常龐大且分布均勻且尚未完全准備好,因此我現在無法真正模擬滿負載。

所以也許你們中的一些人知道一些有趣的文章會向我揭示任何內容。 或者也許你可以分享一些想法。

我的基本直覺是,通過網絡/數據庫對簡單類(如上所述)進行序列化和反序列化沒有任何區別,假設當整個應用程序的IO進程大約為10%時。 (我的意思是系統在90%的時間內做其他事情而不是IO)

我的基本直覺是,通過網絡/數據庫對簡單類(如上所述)進行序列化和反序列化沒有任何區別,假設當整個應用程序的IO進程大約為10%時。 (我的意思是系統在90%的時間內做其他事情而不是IO)

你的直覺聽起來很合理。 但是10%的時間到底是什么? 它只是序列化/反序列化嗎? 或者10%是否包含進行I / O的實際(時鍾)時間?

編輯

如果你有實際的性能分析測量來支持序列化+反序列化+ I / O的“10%到15%”時鍾時間,那么邏輯會告訴你,你可以獲得的最大性能提升將小於那個。 如果可以將I / O與序列化/反序列化分開,則可以優化該上限。 我的猜測是,實際的改善將低於5%。

我建議你創建一個小的基准來發送和接收使用序列化和外化的數據類型之一 ,看看百分比差異時,實際上卻讓。

必須要說的是,通用序列化與最佳實現的外部化相比,存在(相對)顯着的開銷。 很多這是由於序列化的一般屬性。

  • 編組/解組正在傳輸的對象中使用的每個類的類型描述符的開銷。

  • 將每個封送對象添加到散列表有一些開銷,以便序列化忠實地記錄循環等。

但是,序列化/反序列化只占總I / O開銷的一小部分,而這些只是應用程序的一小部分。

這是一個非常好的網站,比較了許多不同的Java序列化機制。

http://github.com/eishay/jvm-serializers/wiki

我會要求他們提出一些測量來支持他們的說法。 然后每個人都有理性討論的基礎。 目前你還沒有。 請注意,那些聲稱應該產生支持證據的人:不要被證明有責任證明他們是錯的。

  1. 通用序列化可以快速查看http://java-is-the-new-c.blogspot.de/2013/10/still-using-externalizable-to-get.html

  2. 如果序列化性能很重要,這取決於您的具體系統。 我已經看到通過加速序列化獲得了很多性能的系統。 它不僅涉及CPU,還涉及延遲。 例如,如果分布式系統執行大量阻塞請求/響應(請求者等待結果),則序列化會增加總體請求響應時間,這可能是重要的,因為其(1)編碼請求(2)解碼請求(3)編碼響應( 4)解碼響應。 因此,每個請求/響應有4個(去)序列化

Java序列化是靈活和標准的,但它的設計並不快,特別是對於簡單的對象。 如果你想要速度,我建議你嘗試粗麻布或protobuf。 對於簡單對象,這些速度可快5倍。 或者你寫一個自定義序列化器,可以快10倍。

對我們來說,自定義序列化是最佳選擇。 我們讓Java的做它好,或者至少不夠好, 是免費的 ,並為它做什么不好定制支持。 這比完全的Externalizable支持要少得多。

我無法想象在什么情況下無法使用Externalizable進行自定義序列化(參考Roman對Peter的答案的評論)。 具體來說,我指的是,例如,writeObject / readObject的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM