2017-05-25 45 views
0

我的Java應用程序正在將Protobuf消息存儲在數據庫中。應用程序速度很快,但速度可能會更快,因爲並非始終使用所有消息部分,導致不必要的數據上的CPU週期浪費。另外,有些消息具有類似樹的結構,導致分配的內存比我想要的多。FlatBuffer的零分配是Java實現嗎?

做一些研究之後,似乎FlatBuffers將是一個不錯的替代,因爲它聲稱它是零配置/零解析。但是,benchmarks已針對C++運行。我的應用程序是用Java編寫的。 FlatBuffer的Java實現仍然是快速的,它仍然是零分配/零解析?

回答

2

它試圖儘可能接近零儘可能分配,但這不是完全可能的。

例如,在C++的值(和C#)存取對象是在Java中的分配。但是,它們可以在多個對象之間重複使用,所以它們的代價可能很低,代碼更復雜一點。

更糟糕的是字符串,這是FlatBuffers UTF-8,但Java不直接支持UTF-8。所以如果你想以String的身份訪問它,它必須被轉換和分配。您可以選擇以UTF-8 ByteBuffer的身份訪問它,但只有極少數API可用。

然而,如果不是數據的所有部分都使用,或者使用增量,這仍然是在一次拆包/分配的一切了巨大的收益。

+0

值得一提的是,現代JVM可以執行轉義分析,並且可以在堆棧中分配對象,如果對象沒有轉義調用堆棧幀。因此重用對象不一定更快,並且由於緩存未命中的增加可能實際上變慢。 – meriton

+0

@meriton好點..但是,API支持任一方式。 – Aardappel

0

library code來看,既分析和對象分配發生懶惰地在屬性訪問。

至於速度,我無法想象這是不是從首位的數據庫中獲取數據顯著慢 - 但隨時基準它:-)