Field.SetValue替代方案

时间:2010-03-20 04:40:44

标签: .net performance optimization reflection

有没有。我刚刚运行了vs2010的新的perf分析工具,结果发现这个func消耗了大部分的cpu资源。

我还能用其他东西吗?

2 个答案:

答案 0 :(得分:3)

您没有提供有关您的情况的足够详细信息以提供明确的答案,但如果您重复设置相同的字段(但在运行时之前您不知道哪个字段),那么您可以创建一个动态方法来设置字段,并反复调用它。有关详细信息,请参阅DynamicMethod classhow to文章,case study with examples)。

可能能够通过构建表达式来设置字段(使用System.Linq.Expressions类)并使用LambdaExpression.Compile编译它们来更轻松地实现相同的功能。这通常比使用Reflection.Emit更容易,但可能不适合您,因为字段通常是私有成员。

请注意,如果您设置了许多不同的字段,并且只设置了每个字段很少次,那么生成动态方法或编译表达式的开销远远超过调用FieldInfo.SetValue 更多 。一如既往,在做出决定前进行衡量!

答案 1 :(得分:2)

除非你属于那些喜欢花时间找出IL来完成工作的少数人,否则我相信你会选择一个图书馆来为你做更好的服务。

我可以推荐Fasterflect,它刚刚在v2.0中发布,支持.NET 3.5和4.0。它使用轻量级代码生成和缓存,比常规反射提高4-5倍速,或者以几乎本机速度直接访问生成的代理(不计算动态方法初始JIT编译的可观开销)。 / p>

免责声明:我作为贡献者参与了该项目。