使用Factory Pattern和If-else或switch时的.NET JIT差异

时间:2018-06-11 17:13:36

标签: c# .net design-patterns clr jit

我只是在徘徊,如果我有一种方法可以处理100个基于枚举的不同情况,那么(假设每个案例平均有5行代码),这会不会影响性能?如何使用Factory或Strategy模式而不是在一个方法中使用所有代码?

JIT只编译该点实际需要的代码。所以我猜它会编译100个案例的洞法吗?它实际上不知道该方法的哪个部分需要正确吗?但如果我要分割那个方法,它实际上会编译它需要的东西吗?例如,有一个动作下拉列表(100个汽车品牌列表)

在性能方面如何相互比较?

感谢。

1 个答案:

答案 0 :(得分:1)

恐怕您会错过Jit要做的重要事情。它将cil(独立于CPU和平台)编译为机器和平台特定于 的机器代码。

  

JIT仅编译当时实际需要的代码。

是的,第一次调用您的方法,然后Jit对其进行编译,因此命名为及时编译器

  

所以我想它将编译100个案例的空洞方法吗?

是的

  

实际上不知道该方法的哪一部分需要正确吗?但是如果我要拆分该方法,它将实际上编译所需的内容,对吗?

现在这里出现了混乱,是的,它将编译整个方法,但是请注意,每次应用程序启动仅一次。由于Jit在运行时进行编译,因此可以说第一次调用该方法会对性能产生 可忽略 的影响,因此可以说将此方法拆分为多个方法将需要多个Jit编译。

话虽这么说,如果您正在对高性能应用程序进行非常高的需求,而您担心Jit的缺点,那么您可以始终使用ngen并在应用程序启动之前编译本机映像,然后CLR可以使用这些映像映像来为您加速该过程,这将删除Jit编译,因为它基本上是在启动应用程序之前完成的。我可以看到这对于关心冷启动的应用程序(例如托管在服务平台上的应用程序)有什么用,但就我在现实世界中的例子而言,就这些。

最后

  

在性能方面,这又如何比较?

老实说,我永远不会担心Jit编译的影响,我宁愿专注于我正在使用的数据结构或我具有的特定领域逻辑以提高性能。