プロトコルバッファの最初の使用の高レイテンシー

Yanickザルツマン:

私たちのJavaアプリケーションの一つで、私たちはかなりの数のプロトコルバッファクラスを持っているし、瓶は、本質的に別のアプリケーションで使用される1つの方法で一つのインタフェースを公開します。私たちは、後続の呼び出しがはるかに速い(<10ミリ秒)している間、このメソッドは呼び出し時初めて呼び出されたときは(> 500ミリ秒)は非常に高いことに気づきました。最初に、私たちは、これはしかし、我々はこれを確認することができませんでしたプロファイリングの後、我々のコードとは何かを持っていると仮定しました。除去のプロセスを通じて、それは、プロトコルバッファとは何かを持っていることが明らかになりました。

だけでなく、プロトコルバッファを使用しています- -同じ挙動を示したこれがさらにとき全く異なる作品異なるアプリケーションで確認されました。さらに我々は、(ダミーのインスタンスを作成しようとしたXY.newBuilder().build()起動時に、我々は、我々は最初の呼び出しドロップのオーバーヘッドに気づくことができ、これら追加の各々と全てプロトバッファクラス)。

.NET Iで示した同様の問題(という別の質問を見つけることができるのはなぜいるProtobufが第一の呼び出しにとても遅いですが、非常に高速なループの内側?)、しかし、解決策は、シリアライザをプリコンパイルしてC#に特異的であるように思われます。私はこれまでJavaで同じ問題を見つけることができませんでした。javaのに適用される上記の質問に示すようにそこの回避策はありますか?

チャールズDowbecki:

あなたのコードにたくさんの最適化を行い、ジャストインタイム(JIT)コンパイラとJVMが付属しています。あなたはさらにそれを理解したい場合は、JVMの内部に掘ることができます。などのクラスのロードとアンロード、パフォーマンスのプロファイル、コードのコンパイルとデコンパイル、バイアスロック、があります

あなたにこれが得ることができますどのように複雑な例を与えるために、あたりとして、この記事、OpenJDKの中にコードのコンパイルの5つの階層を持つ2つのコンパイラ(C1とC2)があります。

階層型コンパイルは、最適化の5層を持っています。これは、ティア0、インタプリタ層、計装、パフォーマンスの重要なメソッドについての情報を提供して開始します。すぐに十分なティア1レベル、単純C1(クライアント)コンパイラは、コードを最適化します。ティア1で、何のプロファイリング情報がありません。次はいくつかのメソッドは、(クライアントコンパイラによって再び)にコンパイルされているティア2、来ます。ティア2で、それらのいくつかのメソッドのために、プロファイリング情報は、エントリ・カウンタとループバック・ブランチのために収集されます。ティア3は、完全なプロファイル情報とクライアントのコンパイラによってコンパイルなったすべてのメソッドを見ること、そして最後にティア4は、C2、サーバーコンパイラの自体が役に立つでしょう。

ここでのお持ち帰りはあなたが予測可能なパフォーマンスが必要な場合は、必ず各展開後、いくつかのダミーのリクエストを実行することで、あなたのコードをウォームアップする必要があることです。

あなたは、すべての使用protobuffオブジェクトを作成するダミーのコードで正しいことをしましたが、あなたはさらに一歩それを取ると、あなたがヒットしている実際の方法をウォームアップする必要があります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=361946&siteId=1