23

dynamic.NETと比較した場合のパフォーマンス コストはobjectどれくらいですか?

たとえば、任意の型のパラメーターを受け入れるメソッドがあるとします。例えば

public void Foo(object obj)
{
}

また

public void Foo(dynamic obj)
{
}

ILSpy によると、動的コードを使用する場合、コンパイラーはダイナミズムを処理するためにコード ブロックを挿入する必要があります。したがって、オブジェクトの代わりにダイナミックを使用することが推奨されるかどうか、およびこの使用法がパフォーマンスを犠牲にしてどのレベルになるかを知りたいですか?

4

2 に答える 2

50

それは正確なシナリオに大きく依存しますが、キャッシングのレイヤーが組み込まれているため、期待するほどひどいものではありません (毎回リフレクションを行うわけではありません)。また、操作によって異なる場合もあります (たとえば、「持ち上げられた」nullable-T 操作は著しく遅くなります)。測定する必要がありますが、たまたま、FastMemberを実行したときに取ったメンバー (プロパティ) アクセスのタイミングがいくつかあります。

Static C#: 14ms
Dynamic C#: 268ms
PropertyInfo: 8879ms (aka reflection)
PropertyDescriptor: 12847ms (aka data-binding)
TypeAccessor.Create: 73ms (aka FastMember)
ObjectAccessor.Create: 92ms (aka FastMember)

注意: これらは単一のテスト用であり、シナリオを代表していない可能性があります。このコードはここに示されています

つまり、単純なテストに基づいて、静的な通常の C# よりも約 20 倍遅く、リフレクションよりも約 30 倍高速です。

更新: 興味深いことに、.NET 4.5 でリフレクションが高速化されたようです:

Static C#: 13ms
Dynamic C#: 249ms
PropertyInfo: 2991ms
PropertyDescriptor: 6761ms
TypeAccessor.Create: 77ms
ObjectAccessor.Create: 94ms

ここでは、リフレクションが高速になったため (ダイナミックが遅くなったからではありません)、リフレクションよりも約 12 倍高速です。

于 2012-11-02T10:56:56.383 に答える
24

したがって、オブジェクトの代わりにダイナミックを使用することが推奨されるかどうか、およびこの使用法がパフォーマンスを犠牲にしてどのレベルになるかを知りたいですか?

動的型付けが必要ない場合は、使用しないでください。

動的型付けが必要な場合 (複雑なリフレクション コードを回避する場合など) は、それを使用してパフォーマンス コストを測定します。

コストは、あなたが何をしているかに大きく依存します。ほとんどの場合、静的に型付けされたコードよりも遅くなりますが、同等の可能性さえありますが、正確なコストに影響を与える可能性のある多くの要因があります。パフォーマンスの問題と同様に、最初から動作する最もクリーンな (必ずしも最短ではない) コードを記述し、パフォーマンスを測定し、パフォーマンスの目標を満たしていない場合は、慎重に最適化します (頻繁に測定して、右方向)。

于 2012-11-02T10:55:52.480 に答える