是否有一种简单的方法可以预先JIT编写C#代码,而不是在第一次调用代码时等待?我读过NGEN,但我认为这不会对我有所帮助。
我的应用程序等待并响应来自UDP端口的特定外部事件,并且没有关键路径代码(a)在事件到达之前运行,或者(b)再次运行,因此成本JIT在这种情况下很高。使用ANTS分析器检查JIT的开销约为40-50%,有时甚至高达90%。我的应用程序对延迟非常敏感,每毫秒都很重要。
我最初的想法是我可以为每个关键路径方法添加一个bool参数,并在事件发生之前调用这些方法,以便启动JIT编译。但是,是否有更漂亮,更少hacky的方式?
非常感谢
答案 0 :(得分:6)
我会说使用NGEN,如果它不起作用,你可能会有更深层次的问题。
但是,要回答您的问题,本文将讨论如何pre-jit使用System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod
来强制执行JIT。它包含使用反射来获取方法句柄的示例代码。
答案 1 :(得分:3)
事件第二次到来会发生什么?是慢还是慢?如果它仍然很慢,那么JIT不是问题,因为代码在第一次运行时只被“JIT”编辑一次。
NGEN会为您提供答案。我的建议是尽可能少地使用你需要的代码,如果你愿意的话,把它放在虚拟/沙箱项目中。开始分析/ NGenning此代码并查看性能。
如果这个最低限度的代码,即使在NGEN'ed多次调用后表现不佳,那么预编译也无法帮助你。它在代码中的其他东西导致性能瓶颈。