我正在研究在服务器(具有多个服务)启动后不久发生的问题延迟问题。
我添加了一个简单的方法,加载引用的DLL并对这些DLL中每个程序集中的每个类型的每个方法执行RuntimeHelpers.PrepareMethod
,有效地JIT整个代码库(一个特定服务) 。这是使用Parallel.ForEach
执行的,只需几秒钟(在四核处理器上100%)。这减少了第一次调用时的延迟问题几乎没有(因为我不是JIT的泛型方法)。它还具有非常低的价格,只需几秒钟的服务初始化。
然而,我的团队领导声称对服务器的这种修改不会投入生产,因为它不安全"并且可能会带来意想不到的结果,他提到动态加载(和卸载?)DLL。
我所描述的可能会带来意想不到的结果,例外等吗?
Windows管理服务的方式是否会影响RuntimeHelpers.PrepareMethod
(反之亦然)?
在常规Windows应用程序中执行相同操作(在所有方法之前进行JIT操作)是不同的吗?
是否与DI冲突(我们正在使用IOC)?
如果我们动态加载DLL,它会以任何方式干扰吗?
一般而言,它会带来什么危害?
答案 0 :(得分:1)
他几乎肯定是错的。
调用此功能不会打破"打破" CLR。
但是,它可能会导致JITter比其他情况更早地加载程序集
如果您稍后添加AssemblyResolve
个处理程序,它们将不再有用,因为CLR已经尝试加载相关的程序集。