我经常听说使用反射是多么糟糕。虽然我通常避免反思,也很少发现不反思就无法解决问题的情况,但我在想……

对于那些在应用程序中使用反射的人,您测量过性能影响吗?它真的那么糟糕吗?


当前回答

反射的代价很高,因为每当您请求与参数列表匹配的方法时,运行时必须进行许多检查。在内部的某个深处,存在一些代码,它们循环遍历一个类型的所有方法,验证其可见性,检查返回类型,并检查每个参数的类型。所有这些都需要时间。

当你在内部执行这个方法时,有一些代码会在执行实际的目标方法之前检查你传递了一个兼容的参数列表。

如果可能,总是建议缓存方法句柄,如果将来要不断地重用它。像所有好的编程技巧一样,避免重复通常是有意义的。在这种情况下,不断地查找具有特定参数的方法,然后每次都执行它将是一种浪费。

戳一下源代码,看看正在做什么。

其他回答

反射不会大幅降低应用程序的性能。不使用反射可能会更快地完成某些事情,但如果反射是实现某些功能的最简单方法,那么就使用它。如果反射成为一个性能问题,你总是可以重构你的代码。

我想你会发现答案是,这要看情况。如果您想把它放在任务列表应用程序中,这不是什么大问题。如果你想把它放在Facebook的持久性库中,这是一件大事。

反射的代价很高,因为每当您请求与参数列表匹配的方法时,运行时必须进行许多检查。在内部的某个深处,存在一些代码,它们循环遍历一个类型的所有方法,验证其可见性,检查返回类型,并检查每个参数的类型。所有这些都需要时间。

当你在内部执行这个方法时,有一些代码会在执行实际的目标方法之前检查你传递了一个兼容的参数列表。

如果可能,总是建议缓存方法句柄,如果将来要不断地重用它。像所有好的编程技巧一样,避免重复通常是有意义的。在这种情况下,不断地查找具有特定参数的方法,然后每次都执行它将是一种浪费。

戳一下源代码,看看正在做什么。

不严重。我从来没有在桌面开发中遇到过问题,除非,正如Martin所说,你在一个愚蠢的位置使用它。我听说很多人对它在桌面开发中的表现有完全不合理的担忧。

然而,在紧凑框架(我经常参与)中,它几乎是一种诅咒,在大多数情况下应该像瘟疫一样避免。我仍然可以不经常使用它,但我必须非常小心地使用它,这就不那么有趣了。:(

我最相关的经验是编写代码来比较大型对象模型中相同类型的任何两个数据实体的属性。把它修好,试了试,显然跑得像条狗。

我很沮丧,然后在一夜之间意识到,在不改变逻辑的情况下,我可以使用相同的算法自动生成方法来进行比较,但静态地访问属性。为了这个目的调整代码完全不花时间,而且我有能力对实体与静态代码进行深入的属性比较,每当对象模型发生变化时,只要单击按钮就可以更新静态代码。

我的观点是:在与同事的对话中,因为我已经多次指出他们使用反射可以自动生成代码来编译,而不是执行运行时操作,这通常值得考虑。