2012-10-24 12 views
21

私はこの3つのマッパーを比較するいくつかの時間を費やしてきた、それが面白いですなぜemitmapperとvalueinjecterまたはautomapperのいずれかの間のように大きなパフォーマンスのdiffrenece(最後の2つの性能によって、同等)。ベンチマークテストからemitmapper溶液(1000000回の反復)で:またエミット・マッパー

Auto Mapper (simple):  38483 milliseconds 
    Emit Mapper (simple):  118 milliseconds 
    Handwritten Mapper (simple): 37 milliseconds 

    Auto Mapper (Nested):  53800 milliseconds 
    Emit Mapper (Nested):  130 milliseconds 
    Handwritten Mapper (Nested): 128 milliseconds 

    Auto Mapper (Custom):  49587 milliseconds 
    Emit Mapper (Custom):  231 milliseconds 

valueinjecterからいくつかのベンチマークは(10000回の反復のために)を加えemitmapperでrunned:最初のEMITマッパー試験であり

Convention: 00:00:00.5016074 
    Automapper: 00:00:00.1992945 
    Smart convention: 00:00:00.2132185 
    Emit mapper(each time new mapper): 00:00:00.1168676 
    Emit mapper(one mapper): 00:00:00.0

- それが作成されました毎回、すべてのコンバージョンの2番目のマッパーです。これを考慮

は、マッパーを発するよりも100倍よりも遅い(またautomapperなど)valueinjecterとして結果を有します。巨大なパフォーマンスの違いの理由は何ですか?私は(私たちは例えばオブジェクトのコレクションをマッピングするために必要がある場合)、それはプロジェクトのボトルネックになるようマッパーが手書きマッパーに比較するので、多くの時間を要したことができないオブジェクトへのオブジェクトの場合と同様。

私はemitマッパーを使用することを考えていますが、私が決定する準備ができていない理由は1つだけです。最初の開発者はまったくサポートしていないマッパーを発行しますが、 (いくつかの付加的な機能性を要求する可能性は非常に低い)。

+4

あなたがテストしたかわからないときに、データから結論を引き出すことは本当に難しいです。 Automapperはリフレクションを使用して初期の自動マッピングを行い、結果をキャッシュします。それを繰り返すたびにその部分を元に戻すと、それはひどく実行できます。テストをどのように実行したかを示すと、より良い回答が得られる可能性が高くなります。 –

+0

私はこのページのベースコードとして2番目の部分に使用しました:http://valueinjecter.codeplex.com/wikipage?title = SmartConventionInjection&referencedTitle = Home 私はemitmapperのホームページからemitmapperプロジェクトのベンチマークプロジェクトを使用しました。 http://emitmapper.codeplex.com)いくつかのベンチマークを提供するための – Igor

+0

おかげで、私はAutomapperを使用しないように決定しました。それはすべてを大幅に減速させた。 – Peter

答えて

11

理由はEmitMapper documentation intを説明します

は、それが効果的にこれらのマッパーを手で書かれているかのようにILで直接実行時にマッパーを生成するために、エミットライブラリを使用しています。他のほとんどのマッパーは、マッピング(またはソースコード生成)にReflectionライブラリを使用します。また、EmitMapperはボクシングのアンボクシング操作とマッピング中の追加呼び出しを最小限に抑えます。たとえば、boxing-unboxingを行わずにvalue-typeの型変換を実行し、可能であれば、ネストしたメンバーを再帰(ワンパスアルゴリズム)なしで変換します。

反射は、手書きコードに比べて非常に遅いです。 EmitMapperは、手書きマッピングと比較して、起動時のオーバーヘッドだけが発生します。

関連する問題