2017-05-25 2 views
0

JavaアプリケーションがProtobufメッセージをデータベースに格納しています。アプリケーションは高速ですが、メッセージのすべての部分が常に使用されるわけではないため、不要なデータにCPUサイクルが浪費されるため、処理速度が向上します。また、いくつかのメッセージは木のような構造をしていて、より多くのメモリを割り当てることができます。FlatBufferのゼロ割り当て用のJava実装ですか?

いくつかの調査をした後、FlatBuffersはゼロ割り当て/ゼロ解析であると主張しているので、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から判断すると、解析とオブジェクトの割り当ての両方がプロパティアクセスに遅延して発生します。スピードに関しては

、私はこれが最初の場所でデータベースからデータをフェッチするよりも大幅に遅いことを想像することはできません - それはゼロに近いことを試み

関連する問題