.NETのための耇数のサむトのテストシリアラむザ

SerbenchコヌドはGitHubの䞊にありたす 。



プロゞェクト開始



このベンチマヌクプロゞェクトは、GeeksWithBlogs.netの蚘事「 .NET v.2のシリアラむザヌ」から始たりたした。 蚘事は、.NETシリアラむザのためにほずんど利甚できるず考えられたした。 しかし、この蚘事ず察応するコヌドを実際のベンチマヌクに倉えるには、いく぀かの改善が必芁でした。



たず、シリアラむザヌはいく぀かのタむプのデヌタでテストする必芁がありたした。 ナニバヌサルシリアラむザがあり、そこに特化されたす。 特殊なものは、ほんの数皮類のデヌタで非垞にうたく機胜したすが、他のデヌタでは、機胜がはるかに悪くなるか、たったく機胜したせん。 私たちは、将来的に持っおいるず確信したした。



第二に、シリアラむザは、むンタヌフェむス䞊で異なりたす。 私たちのベンチマヌクは、圓瀟のシリアラむザむンタフェヌスに埓うように遞択を行うべきではありたせん。 それどころか、ベンチマヌクは非垞に柔軟でなければならず、すべおのシリアラむザがそれに最適なむンタヌフェむスを䜿甚できたす。 ぀たり、ベンチマヌクの特定のシリアラむザに远加のパラメヌタを枡す必芁がありたす。



シリアラむザヌの1人の著者は、改善されたテストを行うこずを提案しお、 蚘事の著者に頌りたした。 著者のシリアラむザは 、このプロゞェクトの創始だった、圌はリヌド開発者でもありたした。 セルゲむは、党䜓のWebプロゞェクトの開発者、すべおの偉倧なレポヌトでした。 ベンチマヌクのプラットフォヌムずしおNFXが䜿甚されたため、蚈画されたすべおのおよび、はるかにを非垞に迅速に行うこずができたした。 NFXはこのような蚘事を䜕癟も利甚しおいたす。圌もあなたの興味を匕くこずを願っおいたす。



詊隓結果の発衚



開始するには、私は特別な泚意が必芁ずいう事実に、結果の提瀺に少し焊点を圓おたす。



䟋ずしお、テストの1぀の抂芁情報を芋おみたしょう。







巊偎には、2぀の最も重芁なカテゎリである3぀の勝者が衚瀺されたす。速床ずシリアル化されたデヌタの量です。 すぐに私は、受賞者がより倚くのすべおのシリアラむザは、青、緑ず、より少ない皋床に、薄茶色のカテゎリの䞭に閉じ蟌め、勝者ず考えるこずができたすするこずができるずいうこずを、蚀いたす。 グレヌカテゎリ - シリアラむザは、このテストに合栌しおいたせん。



コラム速床は、あなたは、シリアラむザの名前をクリックするず、シリアル化および逆シリアル化のために別々の番号を解読速床を埗るこずができたす。



シリアル化ず逆シリアル化からの最悪の速床が䞻なものず芋なされたす。 システム党䜓のパフォヌマンスが重芁であり、シリアル化のみたたはデシリアル化のみのパフォヌマンスではないこずを前提ずしおいたす。 ケヌスが異なる堎合があるため、別の操䜜の速床も现い棒でチャヌトに瀺されたす。



䜕を探すために




䞀郚のテストでは、テストしたほずんどのシリアラむザヌがデヌタを倱いたした。 仕事に「高速」シリアラむザを遞択し、それがデヌタを台無しにする堎合、これは想像できる最悪の事態です。 歪んだデヌタの理由を理解しようずするず、倚くの時間を費やすこずになりたす。 あなたが開発䞭ではなく、生産にそれに぀たずく堎合、あなたは幞運だろう。





掚奚事項ベンチマヌクコヌドをダりンロヌドし、テストデヌタを倉曎するか、デヌタを远加しお再床テストしたす。 あなたの盎芳を決しお信甚せず、倖挿を信甚しないでください。 事実䞊、シリアラむザヌは特定のデヌタサむズに分類されたす。 リミットテストは実行したせんでした。デヌタに぀いおは自分で実行しおください。 非垞に少数のシリアラむザは、すべおの我々のテストに合栌したした。

泚意

たた、本文䞭に、あなたは垞に、「しばしば」など「通垞」の蚀葉に盎面するこずになりたす 私はこれに぀いお謝眪し、これによりテスト結果が少し曖昧になるこずを理解しおいたす。 たた、テスト結果に最高のシリアラむザヌが衚瀺されないこずを理解しおいただきたいず思いたす。 これらは、基瀎ずしお䜿甚する必芁があるシリアラむザヌのグルヌプのみを制限したす。 あなたはシリアラむザのためにあなたのデヌタを䜿甚したす。 したがっお、特にこのデヌタがテストで䜿甚したデヌタず倧きく異なる堎合は、YOURデヌタでテストを実行した埌に最終決定を行う必芁がありたす。

泚意を払っおいないもの




詊隓デヌタ



私たちは、最も䜿甚されるアプリケヌションのためのデヌタを提䟛するこずを詊みたした。 私たちは自分自身の経隓に基づいおデヌタを遞択したように、我々は、シリアラむザの䜿甚には䜕の統蚈情報を持っおいたせん。 重芁なものを芋逃しおいるこずがわかった堎合は、お知らせいただくか、テストデヌタをSerbenchに远加しおください。



我々はいく぀かの分野で芋兞型的なアプリケヌション



デヌタは、このタむプに関連する代衚的な人、テレメトリ、EDI、バッチ。





兞型的な人、バッチ凊理、オブゞェクトグラフこのタむプに関連するデヌタ。





兞型的な人


ここでは単玔なクラスは、むンタフェヌスなしず継承なしです。 ほずんどすべおのシリアラむザは、このテストに合栌したす。



テレメトリヌ


同様のデヌタがIoTをモノのむンタヌネットのデバむスを生成しおいたす。 それらの違いは、数倀情報、タむムスタンプ、およびいく぀かの識別子の可甚性です。 時には、デヌタは非垞に短い、䞀の以䞊の番号に転送する堎合、 時々数字を倧量に送りたした。 シンプルなデヌタ構造。 ここでは、速床が重芁であり、デヌタの充填密床。



゚ディ


EDI電子デヌタ亀換デヌタはドキュメントず同等です。 圌らは、耇雑な階局構造ずネストされたクラスによっお特城づけられたす。 クラスのコレクションがありたす。







オブゞェクトグラフ


オブゞェクト指向開発を䜿甚する堎合、おそらく同様のクラスを凊理する必芁がありたした。 これらは、クラス間の耇雑な関係によっお特城付けられたす。 むベントのコレクションを持぀Conferenceクラスをテストしおいたす。 むベントには、耇数の参加者ず耇数の䌚議トピックを含めるこずができたす。



興味深いのは、参加者が盞手に参照する、いく぀かのリンクリレヌションシップを、持っおいるかもしれないずいうこずです。 結果は、サむクリック通信です。 これは正垞ですが、それは非垞に少数のシリアラむザは、環状接続で䜜業するこずができ刀明したす。







バッチ凊理


あなたは、オブゞェクトの耇数のコピヌを送信する必芁がある状況を想像しおみおください。 これは、分散システムにおける兞型的な状況です。 いく぀かのデヌタ芁玠を1぀のパケットに結合するこずにより、パケットは1ステップでネットワヌクを介しお送信され、転送を倧幅に高速化できたす。 パッケヌゞはバッチず呌ばれるため、名前はバッチです。



通垞、我々は明瀺的に特別なクラスの゚ンベロヌプ封筒のデヌタ芁玠を入れお、パッケヌゞを䜜成する必芁がありたす。 いく぀かのシリアラむザが倧幅に開発を簡玠化し、゚ンベロヌプの排陀を可胜にしたす。



テストプロセス



ここではすべおが簡単です。 1぀のテストサむクルで、1぀のオブゞェクトたたはバッチの堎合は倚数のオブゞェクトをシリアル化し、すぐにそれを逆シリアル化したす。 最終゜ヌスオブゞェクトずバグを取り陀くために比范。 比范は、特定の量で、高速に実行されたす。 完党な比范は行いたせんが、完党な比范のためのすべおのむンタヌフェむスが利甚可胜です。



いく぀かのテストサむクルが1回の実行にたずめられ、最初にテストデヌタが生成されたす。



いく぀かのテストが順番に組み合わされ、最初のテストはりォヌムアップテストです。 このテストは通垞​​1サむクルで構成され、その目的はこのシリアラむザヌに必芁なすべおのオブゞェクトを初期化するこずです。



䞀郚のシリアラむザヌはすぐに初期化されたすが、ゆっくりずシリアル化され、逆もたた同様です。 シリアラむザを1回䜿甚する必芁がある堎合は、りォヌムアップテストの結果を無芖しないでください。これが䞻芁なテストであるためです。



私たちは通垞、最初に単䞀のオブゞェクト、その埌、オブゞェクトのコレクションをテストしたした。 それが刀明したように、シリアラむザは、コレクションで動䜜するように最適化するこずができたす。 その埌、圌らはリヌダヌで倖郚から抜け出すこずができたす。



任意のデヌタは、通垞それは、コレクションは、゚ラヌのゞョブシリアラむザたたは結果の急激な枛速に぀ながる可胜性がある、非垞に倧きくなる可胜性がありたす。 いく぀かのケヌスでは、䞍快なシリアラむザは、単にシステムを切りたした。



詊隓結果



私たちは、テストですべおのテストの合蚈のみを受賞者をリストアップ。 個々のテストの勝者は、 サむトのテスト結果ペヌゞに非垞によく衚されおいたす 。 ここでは、いく぀かの結論を出したす。 私たちは究極の真実を䞻匵せず、数字に぀いおのみコメントするずいう事実にあなたの泚意を集䞭したす。 数字は、今埌のテストのアップデヌトで劇的に倉化するこずができたす。



兞型的な人


テスト結果 。



このテストでは、私は詳现に説明したす。 その他の怜査 - 唯䞀のグランドむンチ



すべおのテスト


いるProtobuf、NFXスリム、MsgPack、NetSerializerほがすべおのテストは、同じ最速のシリアラむザを明らかにしたした。 りォヌムアップのテストは、非垞に倧きな速床の広がりを䞎えおいたす。 Microsoft BinaryFormatterは、コレクションで優れたパッケヌゞングを瀺し、1぀のサむトで最悪のパッケヌゞングを瀺したした。 残念ながら、Json.Netはどのテストでもリヌドを砎りたせんでした。



りォヌムアップテストりォヌムアップ


スピヌド


驚くべき速床の広がりがありたす。 NFX Slimは䜕千もの操䜜を実行したす。たずえば、Jilは1秒間に1぀の操䜜のみを実行したす。 シリアラむザのバルクは、毎秒䞀぀たたは二぀ダヌス操䜜、時には数十を行いたす。 さらに驚くべきこずに、NFX Slimは玄4侇5千人を生産しおいたす 秒あたりのデシリアラむズ。 しかし、我々は、明癜な理由のために、唯䞀の最も遅い操䜜を考えたす。



梱包


スプレッドは、速床ほど倧きくありたせん。 いく぀かの受賞者はほが同じ結果を瀺し、JSONシリアラむザヌは自然に同様の結果を瀺したす。 我々は、具䜓的JSONシリアラむザNFX JSONのいずれかの2぀のテストを行いたした。 テストの䞀぀は、すべおのむンデントず改行、および曞匏蚭定のない他のテスト出力をJSONで、玠敵な圢匏のJSONテキストを提䟛したす。 ご芧のずおり、䞡方のケヌスのサむズは互いに倧きく異なりたす。



チャンネル内のシリアラむズされたデヌタをフォヌマットするこずはありたせん この結果は、もう䞀床、よく知られたルヌルを確認したす 唯䞀のプレれンテヌションず決しおの曞匏行う-転送デヌタに。



バッチ凊理


詊隓結果



ProtoBuf、Microsoft BinaryFormatter、およびNFX Slimのみがシリアル化をシリアル化できたす。 この堎合は、スリムは、特殊なバッチ凊理モヌドを持っおいたす。



ここでは、さたざたな皮類のデヌタのレヌトの倧きな倉動がありたす。 勝者は、トレヌディングおよびEDIクラスのProtoBufから、RPCおよびパヌ゜ナルクラスのSlimたでさたざたです。 同時に、ProtoBufは、オブゞェクト[]フィヌルドが怜出されたRPCクラスをシリアル化できたせんでした。 私たちは、マむクロ゜フトにBinaryFormatterずNFXスリムに成功し、この詊隓に合栌したこずをたずめるこずができたす。 マむクロ゜フトにBinaryFormatterは、い぀ものように、圌ぱラヌなしで働いおいるずいう事実を損なわないパッケヌゞにりォヌムアップずテストの䞀貫貧しい結果に倧きな結果を瀺したした。



オブゞェクトグラフ


テスト結果 。



このテストは、シリアル化が最も難しいこずが刀明したした。 倚くのシリアラむザは、それに合栌しおいたせん。 倚くは合栌したが、それは恐ろしいスピヌドずパッケヌゞングを瀺したした。 ObjectGraph詊隓でゞルは、䟋えば䌚議1。 参加者250; むベント2.6 MWで10パックされたデヌタ、およびより100平方メヌトルより少しでパックされたデヌタの指導者たちは、それが26倍少ないメモリを費やしおきたした。



このテストでは、我々は非垞に倧きなマヌゞンで勝っおいる少数の指導者たちを芋るこずができたす。 これらは、ProtoBufずNFX Slimです。 マむクロ゜フトにBinaryFormatterは、突然の包装の皋床の指導者たちの間で登堎したした。



EDI X12


テスト結果 。



興味深いのは、適切に仕事を終えるためのデヌタよりシリアラむザの容積の増加ず方法でした。



りォヌムアップテストではい぀ものように、リヌダヌはNFX Slimです。



パッケヌゞングのリヌダヌであるProtoBuf、MsgPack、NetSerializer、NFX Slimは、そのような堎合に特別なパッケヌゞング方法を䜿甚しおおり、これらの方法は非垞にうたく機胜しおいるようです。



EDIドキュメントのシリアル化ず凊理によく䜿甚されるXMLが、XmlSerializerの担圓者に、シリアル化されたデヌタに8〜9倍のスペヌスを䜿甚しお、パッケヌゞングの結果をうんざりさせるずいう事実に泚目したす。



シリアラむザを遞択したす



なぜ私たちは、シリアラむザを遞択する必芁がありたすか .NET Frameworkのシリアラむザヌを䜿甚しお取埗できないのはなぜですか Microsoftは、BondやAvroなど、最近登堎したいく぀かのシリアラむザヌを提䟛しおいたす。



シリアラむザは、分散システムのたすたす重芁な芁玠になっおきおいるずいう事実。 䜎速のシリアラむザヌは最倧のパフォヌマンスを劚げる可胜性があり、高速のシリアラむザヌは競合他瀟よりもシステムを改善する可胜性がありたす。 .NETのための新しいシリアラむザは今うらやたしい恒垞で登堎したす。 それらのそれぞれは、最速ずしおもおはやされおいたす。 蚌拠ずしお䜜成者はテストをリヌドしおいたす。



我々は独自のテストシステムを開発し、独立した研究を行っおきたした。 次に、情報に基づいおシリアラむザを遞択するのに圹立぀基準に぀いお説明したす。 遞択の基準は、テストの結果に基づいおいたす。



信頌性のシリアラむズ


私たちは倚くのシリアラむザは、基本的なテストに合栌しおいないこずを芋぀けるために驚きたした。 最高で、我々は最悪の堎合、デヌタは無期限に任意の譊告たたはWindowsのハングせずに倱われ、プログラムに゚ラヌが発生したす。 䞭間ケヌス内のオブゞェクトを歪め。



慎重に我々のテストの結果を読み取りたす。 これらの結果は、デヌタに倧きく䟝存しおいたす。 デヌタの構造が単玔な堎合、ほずんどすべおのシリアラむザヌが仕事をするこずができたす。 デヌタのサむズが耇雑たたは倧きい堎合、悲しいかな、それはあたりよくないです。



速床ずデヌタの充填密床は、倱われたデヌタやシステムの応答停止のために蚀い蚳するこずはほずんどありたせんので、私は、信頌性の応力



確かに、最も信頌性の高いシリアラむザはあるマむクロ゜フトにBinaryFormatter 。 圌は最速の䞀人ではありたせんが、これには重芁な理由がありたす。 圌は、゚ラヌなしでほずんどすべおをシリアラむズしたす。



あなたはデヌタの圢匏を遞択するかどうか


たずえば、XML圢匏のパヌトナヌからデヌタを取埗し、あなたがXMLで䜜業する必芁がありたす。 あなたはこのような状況を倉曎する方法がありたせん。 この堎合、あなたの遞択肢は限られ、XmlSerializerをJson.Netされおいたす。



あなたが他の人のシステムを䜿甚しおシステムを統合する堎合は、次の遞択があなたのために䜜らされ、あなたはおそらく2぀の暙準的な圢匏のいずれかを䜿甚する必芁がありたすXMLやJSONを。 たれなケヌスでは、CSV圢匏たたは特定のシステムのフォヌマットず仕事をしなければなりたせん。 過去千幎のシステムず統合するずきに最も頻繁に起こりたす。



あなたは、このようなint型、ダブル、ブヌルなどの単玔な.NETの型を、シリアラむズする必芁がある堎合は、十分な基本のToString関数を持っおいたす。



シリアラむザは、JSON圢匏での䜜業、より䞀般的です。 JSONはXMLよりもはるかに単玔であり、ほずんどの堎合、これは利点です。



倚くのシリアラむザは、独自のバむナリ圢匏でデヌタをパック。 JSON圢匏は、通垞、はるかにコンパクトなXMLを超えおいたす。 バむナリフォヌマットは通垞、JSONよりもコンパクトです。



あなた自身がデヌタ圢匏を遞択できる堎合、バむナリ・フォヌマットは、最良の遞択である可胜性が高いです。 ただし、この堎合、シリアル化ず逆シリアル化の䞡方に同じシリアラむザヌを䜿甚する必芁があるこずに泚意しおください。 珟時点では、すべおのバむナリ圢匏は䞀意であり、いずれも暙準化されおいたせん。



デヌタパッキング密床


さらに重芁なのは、シリアル化ず逆シリアル化の速床たたはデヌタのパッキング密床ですか



通垞、シリアル化されたデヌタのサむズは、シリアル化-逆シリアル化プロセスの速床よりも重芁です。 これは、プロセッサの速床シリアル化ず逆シリアル化を決定する速床がネットワヌク䞊のデヌタレヌトよりもはるかに高いためです。これは通垞、送信デヌタのサむズに盎接関係したす。 デヌタサむズが10枛少するず、デヌタ転送が10増加し、シリアル化ず逆シリアル化の速床が2倍に増加しおも1しか増加したせん。



あなたは自分のシステムの最高のパフォヌマンスを絞り出すしようずしおいたすか おそらく、あなた開発者の生産性にずっおより重芁




䟋えば、債刞、スリフト、船長プロトなどのシリアラむザを参照しおください。 あなただけの任意のクラスを取り、盎列化したせん。 あなたはこれらのクラスを蚘述しおいないために、特別なIDL蚀語を䜿甚する必芁がありたす。 通垞は、ナヌティリティは、クラス自䜓のクラス定矩を生成するのに圹立ちたす。 しかし、たずえそうであっおも、この蚀語に察凊し、開発自䜓から時間を切り離す必芁がありたす。



他のシリアラむザは、䟋えば、 スリム NFXのは、䜕もあなたが必芁ずしたせん。 あなただけの任意のクラスをシリアル化。 䞭間の堎合、盎列化可胜なクラスは属性で装食する必芁がありたす。 きっずあなたは、属性[Serializableを]に粟通しおいたす。



それが重芁なのですか はい、それは重芁かもしれたせん。 特に、クラスの構造が自明でない堎合。 たずえば、テストシステムには、ネストされた数十のクラスず数癟のフィヌルドで構成されるEDIテストクラスがありたす。 これらすべおのクラスずフィヌルドに属性を远加するのは、面倒で長い仕事でした。



あなたはラむブラリ、あなたがアクセスするこずはできたせんそのコヌドからクラスをシリアル化するずきしかし、それは重芁です。 コヌドを取埗しおそこに属性を远加するこずはできたせん。コヌドは䜿甚できたせん。 倚くの堎合、この状況を回避するために、プログラマヌはいわゆるDTO デヌタ転送オブゞェクト を䜿甚したす。 これらの䜿甚は、プログラムの耇雑さず開発の秋の速さに満ちおいたす。 代わりに、ビゞネスロゞックに取り組んで、あなたはそれずは関係のないコヌドを蚘述する必芁がありたす。



あなたは、シリアラむズするずデシリアラむズするシリアラむザを遞択するか、たたはこれらの操䜜の䞀぀だけ


システムが受信偎たたは送信偎のみである堎合は、同意する必芁がありたす。これは、䞡方の操䜜を担圓する堎合ずは異なりたす。



あなたのデヌタ収集ではありたすか


シリアラむザはオブゞェクトのコレクションで動䜜するように最適化するこずができたす。 他のシリアラむザヌは、コレクションを決しお区別しないため、速床ずパッケヌゞングがはるかに悪くなりたす。



あなたのデヌタのサむズは


デヌタは非垞に倧きくなる可胜性があり、シリアラむザの急激な速床䜎䞋やシリアル化゚ラヌを匕き起こす可胜性がありたす。 シリアラむザは、単玔にシステムがハングアップするこずができたす。



メモリ内の倧芏暡なデヌタは、順番に、長いストラむキプログラムを匕き起こす可胜性があり、ガベヌゞコレクションを、圱響を䞎えるこずができたす。



あなたは非垞に珍しい䜕かをシリアル化する必芁がありたすか


そしお、ここであなたはこのタスクを正確に専門ずするシリアラむザヌによっお助けられたす。 たずえば、 Linq匏を凊理するシリアラむザヌ 。



あなたは超スヌパヌパフォヌマンスが必芁ですか


そしお、最良のオプションは、あなた自身の専門性の高いシリアラむザを曞くこずであろう。



あなたがそれを行うにはしたくない堎合は、別のシリアラむザで䜿甚される远加の方法に泚意を払いたす。 䟋えば、 バッチ凊理速床を高めるための優れた方法です。 残念ながら、わずか数シリアラむザは、任意の远加のコヌディングなしでそれを䜿甚するこずができたす。



䞊列シリアル化は 、高速を達成するための優れた方法でもありたす。 あなたはそれを䜿甚しおいる堎合は、 スレッドセヌフシリアラむザあなたにずっお重芁です。



All Articles