2011-11-01 56 views
7

有没有一种简单的方法可以事先对C#代码进行JIT编程,而不是等待第一次调用代码?我已阅读了NGEN,但我认为这不会帮助我。避免C#JIT开销

我的应用程序等待并响应来自UDP端口的特定外部事件,并且没有关键路径代码(a)在事件到达之前运行,或者(b)再次运行,所以成本的JIT在这种情况下很高。用ANTS分析器检查JIT的开销约为40-50%,有时高达90%。我的应用程序对延迟非常敏感,每毫秒都很重要。

我最初的想法是,我可以为每个关键路径方法添加一个bool参数,并在发生事件之前调用这些方法,以启动JIT编译。但是,有没有更漂亮和不太古怪的方式?

非常感谢

+10

NGEN为什么不帮你? –

+2

你确定它是一个问题吗?或者你只是认为它可能是? –

+0

我(实际上)肯定这是亨克的问题。我只用一种方法实现了我的hacky方法,并且ANTS profiler中该方法的JIT开销已经消失。 – endian

回答

5

我会说使用NGEN,如果它不起作用,您可能会遇到更深层次的问题。

但是,要回答您的问题,本文有关如何pre-jit使用System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod强制JIT。它包含使用反射来获取方法句柄的示例代码。

+2

非常好,谢谢。我还发现了一个CodeProject(!)文章,它为整个类型打包PrepareMethod调用。链接:http://www.codeproject.com/KB/dotnet/Jitting.aspx。 – endian

3

事件第二次到来会发生什么?它是更快还是更慢?如果它仍然很慢,那么JIT不是问题,因为代码只在第一次运行时才被“JIT”编辑一次。

NGEN会为您提供答案。我的建议是尽可能少地使用你需要的代码,如果你愿意的话,也可以把它放在虚拟/沙箱项目中。开始分析/编码此代码并查看性能。

如果这个最低限度的代码,即使NGEN'ed在多次调用中表现不佳,那么预编译也不会帮助你。它在代码中导致性能瓶颈的其他内容。

+0

第一个事件后,代码闪电般快。正如我上面提到的,我已经确定它肯定会导致性能问题的JIT开销。我正在向RuntimeHelpers.PrepareMethod添加一个调用负载的过程,希望这会消除此问题。 – endian