2012-01-05 91 views
0

目前我们有相当厚实的审计制度为我们的应用程序中的对象,流程是这样的..对象审核

-Class实现一个接口

迫使γ-接口的类重写添加一些方法需要审核来KeyValuePairs的列表属性

-Class然后还需要重新创建键值对

现在,开发人员需要这一切都加入到有课,ALS的列表中的对象状态我们的对象经常变化,所以我们不只是连续化课程。

我想要做的就是使用的属性标记属性为审计,然后自动完成一切,所以开发商并不真正需要做任何事情。

我的主要问题是 - 我知道人们总是说反射慢,怎么慢,我们谈论?我将通过查看课程并查看属性和属性来获得什么样的性能,然后执行所需的逻辑?

感谢您的帮助

科技教育,

回答

1

很难给出具体的答案,因为它取决于您的应用程序具有足够的性能。

反思是慢然后正常编译的代码,但不必担心性能问题时,它总是最好有一些作品,然后用分析来发现真正的性能瓶颈和优化。

不成熟的优化可能会导致代码难以维护,因此开发人员的生产力会降低。

我会从使用反射开始,写一组很好的单元测试,让你知道你的代码正在工作。如果性能成为问题,则可以使用Visual Studio Profiler来分析单元测试并发现瓶颈。

有一些库可以加快反射速度,或者如果速度缓慢,可以使用Expression树来代替反射代码。

0

如果performance好不好取决于你的应用程序上下文。所以很难说,如果它是缓慢或快速为你,你应该自己尝试。

最可能的是,海事组织,它会给相当可接受的性能,但同样我不知道在哪里,你要使用它。

一样浮现在我的脑海里其他的解决方案,可能是:

  • sqlite的,在那里保存key/value数据
  • 面向方面编程(如PostSharp)来生成编译时数据。

但第一件事会尝试,是一个反射,就像你想的那样。

+0

感谢您的回应,我没有计划最初使用PostSharp来避免反思并生成所需的所有代码,但是我的公司将不会为任何企业悲伤地使用付费。我尝试反思,并尝试获得一些基准点! – Steoates 2012-01-05 10:08:00

0

阅读this响应来自马克·我建议的反思应该是适合大多数应用需求。

进行任何根本性的变化,我建议运行探查发现在你的代码中的瓶颈之前。如果您确定反射/审计过程是主要难点,请使用IL Emit并再试一次。

+0

我已更新; p – 2012-02-02 09:58:49

0

反射是去这里的路。如果速度太慢(测量!),你可以投入一点缓存,或者在最坏的情况下产生一个Expression<T>并编译它。

有您的问题分为两个阶段:

  1. 找出你想要的属性,并归还其PropertyInfo s的名单。你只需要每种类型只做一次,然后你就可以缓存它。因此,这一步的表现并不重要。
  2. 获取每个属性的价值与PropertyInfo.GetValue

如果此步骤2速度太慢,则需要在步骤1中生成一个表达式,并且手动编写的代码的开销将下降到单个委托调用。