2009-05-21 16 views
6

アプリケーションのデータモデルがXMLドキュメントであるプロジェクトを継承しました。私の前の開発者は、このxmlのスキーマに基づいてオブジェクトモデルを作成し、オブジェクトモデルに対してコード化しました。XMLシリアル化が遅い

メンテナンスの数年後、このアプリケーションは、徐々にその年齢を示し始めています。チームリーダーは、これの背後にある主な理由は、XMLシリアル化の「遅さ」が原因だと言いました。私はこれについてBSに電話をかけたいと思っていますが、扱うXMLファイルの多くは2MBを超えており、[Serializable]と書かれたオブジェクトの裏で何が起こるのかを覚えておいてください。ゆっくりとした理論には真実があるかもしれません。 > XPathのモデルの代わりに、XML - - > POCOモデルあなたの経験で

は、XMLを選ぶすると本当にそう/「遅い」悪いシリアライズですか?

ところでこれは、.NET 2.0のプロジェクトである、と私たちのクライアント来年後半に.NET 3.5にアップグレードされる可能性があります。

答えて

6

一般的に、いいえ、私は減速がXMLシリアル化によるものではないと思います。 2MBはそれほど大きくなく、大きな減速を引き起こしてはいけません。私はより心配になると思い何

は減速があなたにそれが事実だということかを示す情報をプロファイリング任意の特定を与えずに起因して何を言っチームリーダーです。最適化に関する意見はしばしば間違っています。プロファイリングはアプリ内で減速が起こっている場所を正確に見つけるために存在します。私はアプリの計測とプロファイリングをお勧めします。私はそれがXMLのシリアライゼーションではないと確信しています。

6

Xmlシリアル化では、Serializable属性は使用されません。 xmlシリアライザは実際にxmlをオブジェクトにマップするアセンブリを生成しますが、リフレクションは使用しません。これは、Xmlシリアル化がパブリックでしか動作しない理由の1つです。あなたが試みることができる

ことの一つは、WCFの一部であるDataContractSerializerを使用して尺度です。違いを見るのは面白いだろう。

私は個人的には性能限界に走ったことがないが、私はまた、あなたが記述したような大きなオブジェクトを持っていません。

注意しなければならないことは、XmlSerializerを作成するために使用するコンストラクタですが、その一部は生成されたアセンブリをキャッシュしないため、各呼び出しがアセンブリを生成するたびにパフォーマンスが低下しメモリリークが発生します。

1)あなたが作成したシリアライザのインス​​タンスをキャッシュ:このような場合は次の2つのオプションがあります。私はそれがスレッドセーフであると信じていますが、MSDNを再度チェックしたいでしょう。
2)XmlSerializerを作成するための別のコンストラクターをユーザーに割り当てます。

+0

+1すてきな答え。私は、DataContractSerializerのベンチマークを見ると、平均でXmlSerializerよりも約10%速いことがわかりました。 – womp

+0

-1 XMLのシリアライゼーション*はほとんどの場合、Reflectionを使用しているため、 Reflectionを使用しない限り、タイプの詳細を得ることはできません*。今、これらの詳細は*繰り返し使用する必要はありませんが、最初に取得する必要があります。さらに、 'DataContractSerializer'はWCFの一部ではありません。 WCFはそれを大いに活用しますが、WCFの外にあります(名前空間では独自のアセンブリです)。 – casperOne

+0

@casperOne XMLシリアライザは、生成されたアセンブリをキャッシュする正しいコンストラクタを呼び出すと仮定したときにリフレクションを使用します。私はあなたがコンパイル時にもこれを生成することができると信じています – JoshBerke

1

は、プロファイラを実行し、CPU時間の大半が費やされている場所を確認します。 XMLシリアライゼーションであろうとなかろうと、どこにあなたの努力を集中させるのかが分かります。また、記録のために、Spring RPCを使って作業しているときに、Javaの世界でXML直列化が驚くほど遅くなっているのを見ました。あなたの上司が正しいことは間違いありませんが、推測するのではなく、確認する必要があります。

1

それはまだここに記載されていないとして、私は私がビルド時にXMLシリアル化アセンブリを生成するためのVS内のオプションがあることを指摘しようと思いました。

http://msdn.microsoft.com/en-us/library/kb4wyys2(v=VS.100).aspx

また、あなたは、よりきめ細かな制御をしたい場合は世代を行うにはsgen.exe手動で使用することができます。

これは、上記のように、JoshBerkeが述べたように、XmlSerialiserはセリリスまたはデシリアライズが必要なときにいつでも新しいアセンブリを生成するため、型のシリアル化に必要な時間を短縮します。シリアライズアセンブリを事前生成すると、パフォーマンスが大幅に向上します。