5

XML生成のための最高のパフォーマンスソリューションは何ですか。

私の目標は、コードからいくつかの単純なXMLを構築することです。XMLBuilderの単純なカスタムStringBufferベースの実装を実装します。反対側からは、http://code.google.com/p/java-xmlbuilder/やhttp://code.google.com/p/xmltool/のようないくつかのライブラリがあります。これらは優れたDSLを備えていますが、パフォーマンスが不足していると思います。

私の目標は、優れたパフォーマンスを備えた十分に単純なXMLBuilderを構築することなので、カスタムソリューションを構築すると思います。それは特徴とします:

  • XML構造用の優れたJavaベースのDSL(基本的にタグの追加)
  • 優れたStringBufferベースのパフォーマンス。
  • XMLタグを追加するときの文字列データエスケープ処理。
  • 自動インデント

パフォーマンスの期待が間違っているかどうか、そしておそらく既製のライブラリを使用する方が良いかどうかを提案してください。

アップデート。標準のxmlビルダーのパフォーマンスがあまり良くないと思う理由。

標準のXMLビルダーはDocumentBuilderFactoryを使用し、舞台裏でクラスを操作します。また、これらのクラスはすべてのユーザーに合うように最適化されています。たとえば、名前空間のサポートなどは必要ありません。

<?xml version="1.0" encoding="utf-8">
<root>
 <testdata>value</testdata>
</root>
</xml>

上記の非常に単純なXMLコードについて考えてみます。標準ツールを使用してビルドする場合、この単純なXMLを作成するためだけに非常に多くの作業が必要になります。Stringを使って自分で生成したほうがいいと思います。

更新2。パフォーマンス要件は、コードが単純なXMLを生成するために必要なだけ多くのことを実行する必要があることです。

更新3.素晴らしいコメントをありがとうございました!これで、必要なものがよくわかり、最初の目標が「パフォーマンス」という言葉で正しく設定されていなかったことがわかりました。私の本当の目標は、便利なDSLを備えたシンプルで十分なソリューションを使用して、XML構造を記述し、XML出力を生成することです。

XMLのDSLとしてプレーンJavaオブジェクトを使用し、非常に簡単なソリューションであるXStreamライブラリを使用してXMLを生成します。

更新4。JAXB。XStreamとJAXBについて説明したところ、JAXBの方がXStreamよりも高速であることがわかりました。さらに、プロジェクトですでにJAXBを使用しており、その標準のアノテーションが気に入っています。XStreamは、JAXBが今日ほど良くなかったときに元々大幅に開発されていたため、考えを変えて、今はJAXBを使用します。

4

4 に答える 4

4

私は非常に物議を醸すものを提案しますが、それでも...

両方のライブラリを使用してプロファイリングとパフォーマンス テストを行います。

そのための時間がない場合、私の意見では、何かが遅いと仮定するのは間違った選択です。実際に遅くないことが判明した場合は、既に構築されサポートされているライブラリ/フレームワークを使用することで多くの時間を節約できるからです。

別の考え。完成したハイ パフォーマンス ソリューションを既存のソリューションと比較してテストし、それが本当にハイ パフォーマンスかどうかを確認する必要があります。そのため、独自のライブラリを開始する前に、利用可能なライブラリのパフォーマンスを測定することを強くお勧めします。

于 2010-12-10T11:45:38.583 に答える
3

それにかんする:

標準 XML ビルダーは Document Builder Factory を使用し、バックグラウンドでクラスを操作します。また、これらのクラスは、すべてのユーザーに適合するように最適化されています。たとえば、名前空間のサポートなどは必要ありません。

DOM の代替は StAX ( JSR-173 ) です。これは非常に高速な XML 用のストリーミング API です。いくつかの実装がありますが、Woodstoxは非常にパフォーマンスが高いことがわかりました。

于 2010-12-10T16:57:12.420 に答える
2

強力で柔軟な Groovy の NodeBuilder ( http://groovy.codehaus.org/GroovyMarkup ) があります。

def root = new NodeBuilder()
  .people(kind:'folks', groovy:true) {
    person(x:123,  name:'James', cheese:'edam') {
      project(name:'groovy')
      project(name:'geronimo')
    }
    person(x:234,  name:'bob', cheese:'cheddar') {
      project(name:'groovy')
      project(name:'drools')
    }
  }
XmlUtil.serialize(root, System.out)

これにより、次の XML ドキュメントが生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<people kind="folks" groovy="true">
  <person x="123" name="James" cheese="edam">
    <project name="groovy"/>
    <project name="geronimo"/>
  </person>
  <person x="234" name="bob" cheese="cheddar">
    <project name="groovy"/>
    <project name="drools"/>
  </person>
</people>
于 2010-12-10T11:56:23.583 に答える
1

もう 1 つの高パフォーマンスの提案: StaxMateを使用します。これは、基礎となる Stax ベースの XML ライターと同じくらい高速であり、かなり高速です (毎秒 40 から 80 メガバイト、持続)。デフォルトの JDK 6 Stax 実装 (Sun sjsxp) ではなく、Woodstox や Aalto などのより高速なものを使用するようにしてください。

独自の XML ライターを作成しないことを強くお勧めします。他の人が述べたように、通常はリスクが高く(エスケープの一部を忘れる可能性が高い)、既存の効率的なソリューションよりも高速であるとは限りません(既存のすべてのソリューションが効率的であるとは限りません。効率的なソリューションを見つける必要があります)。そして最後に… 本当に書きたいと思わない限り、もっと興味深く有意義なものに取り組まない手はありません。

しかし、既存のライターを超えて何かをしたい場合は、単純なライターを使用して、必要な追加機能を追加することを検討できます。たとえば、Stax XMLStreamWriter をベースとして使用するだけであれば、単純で効率的な抽象化を簡単に追加できます。または、既存のパッケージが気に入った場合は、その作成者に改善を提案できるかどうか (またはコードの貢献も) を確認してください。

于 2010-12-21T23:21:51.850 に答える