私はプロジェクトのためにApache CXFを評価していますので、いくつか試してみるために小さなデモアプリケーションを作成しました。 CXFのユーザーズガイドに続いて、私は自分のアプリケーションを起動し、かなり速く動かすことができました。Apache CXFがプリミティブをオブジェクト型に変換するのを防ぐには?
私がテストしたかったのは、CXFが大量のプリミティブを返すメソッドをどれくらいうまく処理できるかということでした。だから私はメソッド 'float[] getRandFloats(int count)
'を定義し、乱数で満たされた指定された長さの配列を返します。 java2wsdl
によって生成されたWSDLを見ると、メソッドは戻り値の型が正しくfloat[]
であることを示しています。クライアント側を調べると、私も(最終的に)float[]
を受け取っていることがわかります。
配列の要素数を増やすと、クライアントのパフォーマンスが低下することがわかりました。私はクライアント側でプロファイラを実行し、返された配列のすべての要素に対してオブジェクトが作成されていることを確認しました。これは、CXFが応答の解析中にJAXBを呼び出すときに起きているようです。
私は、このオブジェクトの作成が非常に望ましくないように、何百万もの浮動小数点数を返す可能性のあるアプリケーションで使用するためにCXFを評価しています。 CXFを使用するには、このオブジェクトの作成を防ぐ方法を見つける必要があります。ドキュメントとメーリングリストをスキャンしましたが、これを回避する方法はありませんでした。
誰もCXFを使用して同様の問題が発生しましたか?もしそうなら、どうやってこれを回避できましたか?
私はJVMがかなり改善されていることに同意しますが、不要なオブジェクトの作成はまだ "フリー"ではありません。私は少なくともこれをパフォーマンスの低下の原因とみなしたいと思います。 CXFは、このような使い方をするために設計されたものではない可能性があります。私はCXFの知識が豊富な人に、その使用を除外する前にトピックに目を向けてほしいと思っています。 –
無料ですが、 JVMは最初に必要なときにこれらの新しいオブジェクトを作成し、必要に応じてそれらをリサイクルします。これを原因として排除したい場合は、呼び出しを複数回実行して、毎回同じ、または物事が改善された場合。 – skaffman