我经常听说使用反射是多么糟糕。虽然我通常避免反思,也很少发现不反思就无法解决问题的情况,但我在想……
对于那些在应用程序中使用反射的人,您测量过性能影响吗?它真的那么糟糕吗?
我经常听说使用反射是多么糟糕。虽然我通常避免反思,也很少发现不反思就无法解决问题的情况,但我在想……
对于那些在应用程序中使用反射的人,您测量过性能影响吗?它真的那么糟糕吗?
当前回答
As with all things in programming you have to balance performance cost with with any benefit gained. Reflection is an invaluable tool when used with care. I created a O/R mapping library in C# which used reflection to do the bindings. This worked fantastically well. Most of the reflection code was only executed once, so any performance hit was quite small, but the benefits were great. If I were writing a new fandangled sorting algorithm, I would probably not use reflection, since it would probably scale poorly.
很抱歉,我还没有完全回答你的问题。我的观点是,这并不重要。在适当的地方使用反射。它只是你需要学习如何以及何时使用的另一种语言功能。
其他回答
As with all things in programming you have to balance performance cost with with any benefit gained. Reflection is an invaluable tool when used with care. I created a O/R mapping library in C# which used reflection to do the bindings. This worked fantastically well. Most of the reflection code was only executed once, so any performance hit was quite small, but the benefits were great. If I were writing a new fandangled sorting algorithm, I would probably not use reflection, since it would probably scale poorly.
很抱歉,我还没有完全回答你的问题。我的观点是,这并不重要。在适当的地方使用反射。它只是你需要学习如何以及何时使用的另一种语言功能。
在Jeff Richter的演讲The Performance of Everyday Things中,他展示了通过反射调用一个方法要比正常调用慢1000倍。
Jeff的建议:如果需要多次调用该方法,请使用一次反射来找到它,然后将其分配给委托,然后调用委托。
反射性能将取决于实现(重复调用应该被缓存,例如:entity.GetType(). getproperty ("PropName"))。由于我每天看到的大多数反射都用于从数据阅读器或其他存储库类型结构填充实体,所以我决定在反射用于获取或设置对象属性时对其性能进行基准测试。
我设计了一个测试,我认为是公平的,因为它缓存所有重复的调用,只乘以实际的SetValue或GetValue调用。性能测试的所有源代码都在bitbucket中:https://bitbucket.org/grenade/accessortest。审查是受欢迎和鼓励的。
我得出的结论是,在反射实现做得很好的情况下,在数据访问层中删除反射是不实际的,也不能提供明显的性能改进。
上图展示了我的小基准测试的输出,并显示了优于反射的机制,只有在100,000次循环之后才会明显表现出来。大多数dal一次只返回几百行或数千行,在这些级别反射执行得很好。
反射的代价很高,因为每当您请求与参数列表匹配的方法时,运行时必须进行许多检查。在内部的某个深处,存在一些代码,它们循环遍历一个类型的所有方法,验证其可见性,检查返回类型,并检查每个参数的类型。所有这些都需要时间。
当你在内部执行这个方法时,有一些代码会在执行实际的目标方法之前检查你传递了一个兼容的参数列表。
如果可能,总是建议缓存方法句柄,如果将来要不断地重用它。像所有好的编程技巧一样,避免重复通常是有意义的。在这种情况下,不断地查找具有特定参数的方法,然后每次都执行它将是一种浪费。
戳一下源代码,看看正在做什么。
我想你会发现答案是,这要看情况。如果您想把它放在任务列表应用程序中,这不是什么大问题。如果你想把它放在Facebook的持久性库中,这是一件大事。